[
  {
    "path": ".dockerignore",
    "content": "# ignore everything but ci/ and lib/AppImageUpdate/ci/\n# note that the last line that matches a file decides, so ! rules after * decide which files to include\n*\n!ci/\n!lib/AppImageUpdate/ci/\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: \"Bug report\"\ndescription: \"Report a bug to help us improve AppImageLauncher\"\nlabels: [\"bug\", \"needs verification\"]\nbody:\n- type: markdown\n  attributes:\n    value: |\n      Thank you for making AppImageLauncher better by reporting a bug. Please fill in as much information as possible about your bog so that we do not have to play \"information ping-pong\" but can help you immediately.\n\n      If this is the first time you report a bug, please read https://www.chiark.greenend.org.uk/~sgtatham/bugs.html.\n\n      Please note: this is an issue tracker. ***Questions may not be asked here.*** Instead, please visit the IRC channel `#appimage` on Libera.Chat. See https://docs.appimage.org/contact.html for more information.\n- type: checkboxes\n  id: pre-submit-checks\n  attributes:\n    label: Pre-submit checks\n    description: |\n      Before submitting a bug report, please make sure you check the following boxes. Otherwise, your issue will not be processed.\n    options:\n      - label: I [checked for similar issues](https://github.com/TheAssassin/AppImageLauncher/issues?q=) beforehand, but could not find any, not even closed ones. I could not add my bug report to any existing issue.\n        required: true\n      - label: I am going to take the time to to fill in all the required details. I know that the bug report will be dismissed otherwise.\n        required: true\n- type: textarea\n  id: description\n  attributes:\n    label: Describe the bug\n    description: Please describe the bug as precisely as possible. You cannot add too many details, every information is important!\n    placeholder: While clicking on button [...], the application unexpectedly [...]\n  validations:\n    required: true\n- type: textarea\n  id: expected-behavior\n  attributes:\n    label: Expected behavior\n    description: Describe what you think should have happened instead as precisely as possible.\n    placeholder: \"I expected to see [...]\"\n  validations:\n    required: true\n- type: textarea\n  id: to-reproduce\n  attributes:\n    label: Steps to reproduce the issue\n    description: |\n      We need to reproduce the issue in a neutral environment in order to understand what causes it.\n      Please describe the steps needed to do to trigger the bug as detailedly as possible.\n    placeholder: |\n      1. Go to [...]\n      2. Click on [...]\n      3. Scroll down to [...]\n      4. See the error message\n- type: textarea\n  id: screenshots\n  attributes:\n    label: Screenshots\n    description: Please add screenshots if possible that visualize your problem and/or show how to reproduce the bug.\n    placeholder: ![screenshot describing the issue](https://raw.githubusercontent.com/TheAssassin/AppImageLauncher/master/resources/doc/screenshot.png)\n- type: textarea\n  id: distro\n  attributes:\n    label: Distribution and desktop environment\n    description: |\n      We need precise information about your computer's operating system. Please include version numbers.\n      You can find guides about varying distributions and desktop environments on [this Wiki page](https://github.com/TheAssassin/AppImageLauncher/wiki/Find-information-about-distribution-and-desktop-environment).\n  validations:\n    required: true\n- type: textarea\n  id: appimagelauncher-version\n  attributes:\n    label: Installed AppImageLauncher version\n    description: Please post the output of `AppImageLauncher --appimagelauncher-version`.\n    placeholder: For example, AppImageLauncher version 2.2.0 (git commit ea0984c), built on 2021-12-22 22:03:21 UTC\n  validations:\n    required: true\n- type: textarea\n  id: appimages-tried\n  attributes:\n    label: List of AppImages you tried (ideally with URL)\n    description: Please post a list of AppImages you tried (including the information whether they work or not, a version number or filename, ideally also a URL)\n    placeholder: |\n      - FreeCAD 0.19.3 (working), https://github.com/FreeCAD/FreeCAD/releases/download/0.19.3/FreeCAD_0.19.3-Linux-Conda_glibc2.12-x86_64.AppImage\n      - Subsurface Divelog 5.0.5 (broken), using download button on https://subsurface.github.io/de/download/\n- type: textarea\n  id: additional-context\n  attributes:\n    label: Additional context\n    description: Any other information you'd like to include.\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n\ncontact_links:\n  - name: 💬 IRC Webchat\n    url: https://web.libera.chat/#appimage\n    about: Chat with the AppImage community in `#appimage` on the Libera.Chat IRC network\n  - name: 💡 AppImageKit issue tracker\n    url: https://github.com/AppImage/AppImageKit\n    about: Issues regarding AppImages in general need to be opened there.\n  - name: 💡 libappimage issue tracker\n    url: https://github.com/AppImage/libappimage\n    about: The right place to open issues about the desktop integration of AppImages.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: \"Feature request\"\ndescription: \"Suggest an idea for this project\"\nlabels: [\"enhancement\"]\nbody:\n- type: markdown\n  attributes:\n    value: |\n      Thank you for making AppImageLauncher better by suggesting a feature. Your ideas are highly welcome! It's a tool for you, the users, after all.\n\n      Please try to describe your proposal as precisely as possible, including as many details as you can. Please don't hesitate to add screenshots or mockups.\n\n      Please note: this is an issue tracker. ***Questions may not be asked here.*** Instead, please visit the IRC channel `#appimage` on Libera.Chat. See https://docs.appimage.org/contact.html for more\n- type: checkboxes\n  id: pre-submit-checks\n  attributes:\n    label: Pre-submit checks\n    description: |\n      Before submitting a bug report, please make sure you check the following boxes. Otherwise, your issue will not be processed.\n    options:\n      - label: I checked for similar issues beforehand, but could not find any. I could not add my proposal to any existing issue.\n        required: true\n      - label: I am going to take the time to to fill in all the required details. I know that the bug report will be dismissed otherwise.\n        required: true\n- type: textarea\n  id: description\n  attributes:\n    label: Feature description\n    description: Is your feature request to a problem? Please describe your suggestion as detailedly as possible.\n    placeholder: I would like to have another button that [...]\n  validations:\n    required: true\n- type: textarea\n  id: proposed-solution\n  attributes:\n    label: Proposed solution\n    description: Describe the solution you would like to see.\n    placeholder: Instead of the current blue button, I would like a yellow button that says [...]\n  validations:\n    required: true\n- type: textarea\n  id: alternatives\n  attributes:\n    label: Alternative solutions you considered\n    description: |\n      Please list alternative solutions or features you considered to cover your use case. Ideally, include their pros and cons.\n- type: textarea\n  id: additional-context\n  attributes:\n    label: Additional context\n    description: Any other information you'd like to include, for instance, screnshots, mockups, etc.\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"docker\"\n    directory: \"/ci\"\n    schedule:\n      interval: \"weekly\"\n\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Continuous builds\n\non: [push, pull_request, workflow_dispatch]\n\njobs:\n  build:\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - NAME: Packages x86_64\n            RUNS_ON: ubuntu-24.04\n            DOCKER_PLATFORM: linux/amd64\n          - NAME: Packages aarch64\n            RUNS_ON: ubuntu-24.04-arm\n            DOCKER_PLATFORM: linux/arm64/v8\n          - NAME: Packages armhf\n            RUNS_ON: ubuntu-24.04-arm\n            DOCKER_PLATFORM: linux/arm/v7\n          - NAME: Lite AppImage x86_64\n            RUNS_ON: ubuntu-24.04\n            DOCKER_PLATFORM: linux/amd64\n            BUILD_LITE: 1\n          - NAME: Lite AppImage aarch64\n            RUNS_ON: ubuntu-24.04-arm\n            DOCKER_PLATFORM: linux/arm64/v8\n            BUILD_LITE: 1\n          - NAME: Lite AppImage armhf\n            RUNS_ON: ubuntu-24.04-arm\n            DOCKER_PLATFORM: linux/arm/v7\n            BUILD_LITE: 1\n\n    name: ${{ matrix.NAME }}\n    env:\n      DOCKER_PLATFORM: ${{ matrix.DOCKER_PLATFORM }}\n      DIST: ${{ matrix.DIST }}\n      BUILD_LITE: ${{ matrix.BUILD_LITE }}\n    runs-on: ${{ matrix.RUNS_ON }}\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          submodules: 'recursive'\n      - name: Login to GitHub Container Registry\n        uses: docker/login-action@v3\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n      - name: Build in Docker\n        run: bash -ex ci/build-in-docker.sh\n      - name: Archive artifacts\n        uses: actions/upload-artifact@v6\n        with:\n          name: build ${{ matrix.NAME }}\n          path: |\n              appimagelauncher*.deb*\n              appimagelauncher*.rpm*\n              appimagelauncher*.tar*\n              appimagelauncher-lite-*.AppImage*\n\n  upload:\n    name: Create release and upload artifacts\n    needs:\n      - build\n    runs-on: ubuntu-latest\n    steps:\n      - name: Download artifacts\n        uses: actions/download-artifact@v8\n      - name: Inspect directory after downloading artifacts\n        run: ls -alFR\n      - name: Create release and upload artifacts\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          WEBDAV_URL: ${{ secrets.WEBDAV_URL }}\n          WEBDAV_USER: ${{ secrets.WEBDAV_USER }}\n          WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}\n          APPIMAGE_EXTRACT_AND_RUN: 1\n        run: |\n            wget -q https://github.com/TheAssassin/pyuploadtool/releases/download/continuous/pyuploadtool-x86_64.AppImage\n            chmod +x pyuploadtool-x86_64.AppImage\n            ./pyuploadtool-x86_64.AppImage **/appimagelauncher*.{deb,rpm,AppImage*}\n"
  },
  {
    "path": ".gitignore",
    "content": "cmake-build-*/\nbuild*/\n*.AppImage*\n*.deb*\n*.tar*\ncmake/GIT_COMMIT\nsquashfs-root/\n*.qm\nresources/l10n/*\n*.html\n*.swp\n*.rpm*\n"
  },
  {
    "path": ".gitmodules",
    "content": ""
  },
  {
    "path": ".idea/codeStyles/Project.xml",
    "content": "<component name=\"ProjectCodeStyleConfiguration\">\n  <code_scheme name=\"Project\" version=\"173\">\n    <CMakeCodeStyleSettings>\n      <option name=\"FORCE_COMMANDS_CASE\" value=\"1\" />\n    </CMakeCodeStyleSettings>\n    <Objective-C>\n      <option name=\"SPACE_BEFORE_POINTER_IN_DECLARATION\" value=\"false\" />\n      <option name=\"SPACE_AFTER_POINTER_IN_DECLARATION\" value=\"true\" />\n      <option name=\"SPACE_BEFORE_REFERENCE_IN_DECLARATION\" value=\"false\" />\n      <option name=\"SPACE_AFTER_REFERENCE_IN_DECLARATION\" value=\"true\" />\n    </Objective-C>\n    <codeStyleSettings language=\"CMake\">\n      <indentOptions>\n        <option name=\"CONTINUATION_INDENT_SIZE\" value=\"4\" />\n      </indentOptions>\n    </codeStyleSettings>\n    <codeStyleSettings language=\"ObjectiveC\">\n      <indentOptions>\n        <option name=\"CONTINUATION_INDENT_SIZE\" value=\"4\" />\n      </indentOptions>\n    </codeStyleSettings>\n    <codeStyleSettings language=\"Shell Script\">\n      <indentOptions>\n        <option name=\"INDENT_SIZE\" value=\"4\" />\n        <option name=\"TAB_SIZE\" value=\"4\" />\n      </indentOptions>\n    </codeStyleSettings>\n  </code_scheme>\n</component>"
  },
  {
    "path": ".idea/codeStyles/codeStyleConfig.xml",
    "content": "<component name=\"ProjectCodeStyleConfiguration\">\n  <state>\n    <option name=\"USE_PER_PROJECT_SETTINGS\" value=\"true\" />\n  </state>\n</component>"
  },
  {
    "path": "BUILD.md",
    "content": "# How to build AppImageLauncher\n\n**Note:** This file was contributed by a user. It may be out of date.\n\nIf there are no pre-build binaries for your platform you may consider to build AppImageLauncher yourself. Please follow these instructions.\n\n\n## Download source\n\nThis step is only required if you would like to build the source from GitHub. *If you have a local copy, please skip this section.*\n\nYou can download the source either using Git or by mannually downloading a tarball on the [Releases page](https://github.com/TheAssassin/AppImageLauncher/releases).\n\nThe branch can be customized by setting the `-b` or `--branch` argument. Select `stable` to download the current stable source or use `master` to get the most current unstable source containing the latest features.\n\n```shell\ngit clone https://github.com/TheAssassin/AppImageLauncher.git -b stable\ncd AppImageLauncher\ngit submodule update --init --recursive\n```\n\n\n## Dependencies\n\nAll dependencies need to be installed as development libraries. Some names may differ on your system.\n\n - make\n - cmake\n - glib-2\n - cairo\n - librsvg\n - fuse\n - libarchive\n - libXpm\n - qt5\n - libcurl\n - boost\n\nFor Ubuntu/Debian systems, this might look like:\n\n```bash\nsudo apt install make cmake libglib2.0-dev libcairo2-dev librsvg2-dev libfuse-dev libarchive-dev libxpm-dev libcurl4-openssl-dev libboost-all-dev qtbase5-dev qtdeclarative5-dev qttools5-dev-tools patchelf libc6-dev libc6-dev gcc-multilib g++-multilib\n```\n\n## Build\n\nPlease update the `PREFIX` if you want. The prefix is the location the final application will be installed to. Usual locations may be `/usr/local` (default), `/usr`, `~/.local` or `/opt`.\n\n```shell\nexport PREFIX=\"/usr/local/\"\nmkdir build\ncd build\n\ncmake .. -DCMAKE_INSTALL_PREFIX=\"$PREFIX\" -DUSE_SYSTEM_BOOST=true\n\n# See https://github.com/TheAssassin/AppImageLauncher/issues/251 for more details why this is required\nmake libappimage libappimageupdate libappimageupdate-qt\ncmake .\n\nmake\n```\n\nNow you may create a distribution package or alternatively install the source for testing purpose.\n\n*Note: This may harm your system. It's highly recommended to build and install distribution packages instead.*\n\n```shell\nsudo make install\n```\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.5)\n\nproject(AppImageLauncher)\n\n# versioning\ninclude(cmake/versioning.cmake)\n\nset(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake/modules)\n\ninclude(cmake/scripts.cmake)\n\ninclude(cmake/reproducible_builds.cmake)\n\n# support for ccache\n# call CMake with -DUSE_CCACHE=ON to make use of it\noption(USE_CCACHE OFF)\nif(USE_CCACHE)\n    find_program(CCACHE ccache)\n    if(CCACHE)\n        message(STATUS \"Using ccache\")\n        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})\n        set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})\n    else()\n        message(WARNING \"USE_CCACHE set, but could not find ccache\")\n    endif()\nendif()\n\n# used by Debian packaging infrastructure\ninclude(GNUInstallDirs)\n\n# if there's a system libappimage package on the system, we can use that directly\noption(USE_SYSTEM_LIBAPPIMAGE OFF)\n\n# if the system version should be used, import globally _before_ including third-party stuff and own executables/libs\nif(USE_SYSTEM_LIBAPPIMAGE)\n    find_package(libappimage REQUIRED)\nendif()\n\ninclude(FetchContent)\n\n# AppImageUpdate is needed for the updater UI (and libappimage)\nFetchContent_Declare(AppImageUpdate\n    GIT_REPOSITORY https://github.com/AppImageCommunity/AppImageUpdate.git\n    GIT_TAG 2.0.0-alpha-1-20251018\n    EXCLUDE_FROM_ALL\n)\n\n# work around Wimplicit-function-declaration in ancient squashfuse code\nset(DEPENDENCIES_CFLAGS \"-Wno-implicit-function-declaration\" CACHE STRING \"\" FORCE)\n\noption(ENABLE_UPDATE_HELPER ON)\nif(ENABLE_UPDATE_HELPER)\n    # instruct AppImageUpdate to build the Qt UI\n    set(BUILD_QT_UI ON CACHE BOOL \"\" FORCE)\nendif()\n\n# note: for the time being, we require AppImageUpdate to be fetched during build, even if only to make libappimage available\nFetchContent_MakeAvailable(AppImageUpdate)\n\n# install resources, bundle libraries privately, etc.\n# initializes important installation destination variables, therefore must be included before adding subdirectories\ninclude(cmake/install.cmake)\n\nadd_subdirectory(src)\n\n# contains install configs for resource files\nadd_subdirectory(resources)\n\n# translation management\nadd_subdirectory(i18n)\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to AppImageLauncher\n\nThere are many ways how you can help improve the AppImageLauncher project. Everyone with some interest in technology, not just developers, can help make the project better. Any contribution is welcome!\n\n\n## Translations\n\nAppImageLauncher is developed in the English language. If you speak any other language (e.g., your mother language or a foreign language), you can help translate AppImageLauncher into that language.\n\nTo translate AppImageLauncher, you can use the very good [Weblate](https://weblate.org). We run [our own instance](https://translate.assassinate-you.net/projects/appimagelauncher/). Just sign up there and start translating strings.\n\nYou can also review and improve existing translations.\n\nDuring development, strings regularly change, and new strings are added while olds are removed. Therefore, you're welcome to check from time to time whether there's new work to be done. We appreciate every contribution.\n\n\n## Documentation & Tutorials\n\nAppImageLauncher is a tool for everyone, not just tech savvy people. However, there is a lack of documentation. We invite every interested user to improve our README, add and edit our\n[Wiki](https://github.com/TheAssassin/AppImageLauncher/wiki), write articles, make (video) tutorials etc. The only limit is your imagination!\n\nThe README already links to a lot of articles, videos, podcasts and potentially other media. If you find some more and want them to be added to the list, just send a\n[pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests).\n\n\n## Bug reporting\n\nIf you encounter a problem and consider it to be a bug, please do not hesitate to [open a new issue](https://github.com/TheAssassin/AppImageLauncher/issues/new). Even if you can't help fix the problem, reporting it is required\nand the only way for you to receive a solution. Also, if the problem is affecting others, too, others can find the discussion online and find out how to solve the issue.\n\nPlease make sure to add as many details as possible to your bug report. This way, the developers can focus on finding a solution instead of playing information ping-pong.\n\nSee also: https://www.chiark.greenend.org.uk/~sgtatham/bugs.html (but please don't send bug reports to Simon Tatham!)\n\n\n## Feature requests\n\nYou can also [open a new issue](https://github.com/TheAssassin/AppImageLauncher/issues/new) to request new features. If you have an idea and think it might help the users of the project, please don't hesitate to send it to us.\n\nPlease describe your idea as detailedly as possible.\n\n\n## Fix bugs and send pull requests\n\nIf you encounter a bug and have the skill and ability to find the solution even, please feel free to send us a pull request. Any contribution is welcome!\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright (C) 2018-2020 TheAssassin <theassassin@assassinate-you.net>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# AppImageLauncher\nmakes your Linux desktop AppImage ready™\n<p align=\"center\">\n<img src=\"https://github.com/TheAssassin/AppImageLauncher/raw/master/resources/icons/hicolor/128x128/apps/AppImageLauncher.png\"/>\n</p>\n\nIntegrate AppImages to your application launcher with one click, and manage, update and remove them from there.\nDouble-click AppImages to open them, without having to make them executable first.\n\nAppImageLauncher plays well with other applications managing AppImages, for example app stores.\nHowever, it doesn't depend on any of those, and can run completely standalone.\n\n<p align=\"center\">\n<img src=\"https://github.com/TheAssassin/AppImageLauncher/raw/master/resources/doc/screenshot.png\"/>\n</p>\n\n> ### :smiley: Info on how to install and use AppImageLauncher on the [wiki](https://github.com/TheAssassin/AppImageLauncher/wiki).\n\nAppImageLauncher is a novel and unique solution of integrating with the system. It intercepts all attempts to open an AppImage to provide its integration features.\n\nBeing the launcher for AppImages, AppImageLauncher can control how the system treats AppImages. It integrates them into the system, provides helpers for updating or removing AppImages, and a lot more.\n\nOn their first execution (i.e., if they have not been integrated yet), it displays a dialog prompting the user whether to run the AppImage once, or move it to a predefined location and adding it to the application menus, launchers, etc.\n\n\n## Features\n\n### AppImage desktop integration\n\nThis core feature allows you to integrate AppImages you download into your application menu or launcher, to make it easier for you to launch them. It also takes care of moving them into a central location, where you can find them later.\nFurthermore, it sets up the update and removal entries in the launcher for you.\n\nAppImages use the term \"desktop integration\", as they're not \"installed\" in the traditional sense. They remain single, self-contained executable files. AppImageLauncher and other tools extract and patch the [desktop entry](https://specifications.freedesktop.org/desktop-entry-spec/latest/) as well as the related [icons](https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html) into the relevant locations.\nMore information on desktop integration can be found in the [AppImage docs](https://docs.appimage.org/reference/desktop-integration.html).\n\n\n### Update management\n\nAfter desktop integration, the context menu of the AppImage's entry in the application launcher will have an \"Update\" entry that launches a little helper tool to apply updates.\n\n\n### Remove AppImages from system\n\nClick the \"Remove\" entry in the context menu in the application launcher and the removal tool will ask you to confirm.\nIf you choose to do so, the desktop integration is undone, and the file is removed from your system.\n\n\n### CLI\n\nThe packages ship with a CLI tool called `ail-cli`, providing basic operations in the terminal, for automation in scripts etc. As of February 2020, only integration and unintegration are supported. More features planned!\n\n\n## Differences between regular and Lite version\n\nFrom version 1.4.0, there's a *Lite* edition of AppImageLauncher.\nIt provides all of AppImageLauncher you can get without having root access to your computer. AppImageLauncher Lite is shipped as an AppImage, which can be installed by users from the command-line.\nEnter `./appimagelauncher-lite...AppImage install`. in a terminal, and it integrates itself in the users' home directory.\n\n**Traditional packages are highly recommended *if possible*, as they provide many more features and provide a much better overall experience.**\n\n*Note: if you're interested in a GUI installer, please consider sending a pull request. More information in [#243](https://github.com/TheAssassin/AppImageLauncher/issues/243).*\n\n## About\n\nCurrently, desktop environments consider executables a security risk, and would rather have users use the app stores they include.\n\nThe ability to easily run them, however, isn't all that's needed to provide a good AppImage desktop experience. Making them accessible from the application menus and launchers is a level of \"desktop integration\" that can't be provided by the AppImages themselves properly (even though some AppImages ship with a \"desktop integration script\" prompting the user to do so). There are too many impliciations requiring external software, especially regarding cleanup and removal of AppImages. (If applications are simply made executable, they're still spread all over the users' personal files and folders.) The average user will not find a \"Downloads\" directory full of AppImages with cryptic filenames friendly.\n\nTherefore, system-side ways have been developed to perform the desktop integration.\nOne of the first solutions was [appimaged](https://github.com/AppImage/appimaged), a daemon users could install to perform everything automagically in the background, without notifying the user in any way.\nIt scans a predefined set of directories including `~/Downloads` and `~/.bin`, making recognized AppImages executable and then performing the desktop integration. Those operations and monitoring produced a lot of file I/O, so were rather inefficent. Also, many users don't like the lack of control. The approach also opens attack vectors and thus can be considered a security hazard, as a vulnerability discovered in appimaged recently has shown.\n\n\n## As seen in\n\n### :movie_camera: Tutorials:\n\n* [Eric Adams](https://invidio.us/watch?v=D2WA2zdLvVk)\n\n\n### :sound: Podcasts:\n\n* [DLN Xtend 11h](ttps://dlnxtend.com/11)\n  + [Invidious](https://invidio.us/watch?v=yaZygqyN_KE)\n* [DLN Xtend 14](https://dlnxtend.com/14)\n  + [Invidious](https://invidio.us/watch?v=QCkJ74kOlGQ)\n\n\n### :page_facing_up: Articles\n\n  * [Linux Uprising](https://www.linuxuprising.com/2018/04/easily-run-and-integrate-appimage-files.html) (English)\n  * [Linux-OS.net](https://linux-os.net/appimagelauncher-ejecuta-e-integra-facilmente-aplicaciones-en-appimage/) (Spanish)\n    + Same article also available [here](https://blog.desdelinux.net/appimagelauncher-ejecuta-e-integra-facilmente-aplicaciones-en-appimage/).\n  * [Edvaldo Brito](https://www.edivaldobrito.com.br/integrador-appimagelauncher-no-linux/) (Portuguese)\n  * [przystajnik](https://404.g-net.pl/2018/08/appimagelauncher/) (Polish)\n  * [Linux Mint Magyar Közösség](https://linuxmint.hu/blog/2018/12/appimage) (Hungarian)\n  * [FreeYourDesktop](https://medium.com/@freeyourdesktopblog/install-manage-appimages-with-appimagelauncher-2a2078c55f37) (English)\n    + Please note that AppImageLauncher could *not* be \"installed\" via AppImage at that time, only recently was a Lite version added, that now can be installed from an AppImage (more info to follow.)\n  * [Pardus forum](https://forum.pardus.org.tr/t/appimagelauncher-tek-tiklama-ile-appimage-sisteminizle-butunlestiriniz/11275) (Turkish)\n  * [Linux Team Vietnam](https://linuxteamvietnam.us/cach-chay-ung-dung-dinh-dang-appimage-tren-linux/) (Vietnamese)\n    + Contains a few wrong assumptions: as soon as AppImageLauncher is installed, you do not have to make AppImages executable, you can just double-click them (or otherwise open them, e.g., from your file- or web-browsers' downloads).\n  * [RealLinuxUser](https://www.reallinuxuser.com/15-best-things-to-do-after-installing-zorin-os-15/) (English)\n  * [manjaro.site](https://manjaro.site/how-to-install-appimage-launcher-on-ubuntu-19-04/) (English)\n  * [CubicleNate's Techpad](https://cubiclenate.com/2020/01/09/appimagelauncher-appimage-manager-on-opensuse/) (English)\n    + See also: [CubicleNate's Techpad](https://cubiclenate.com/2020/01/10/noodlings-lighting-the-emby-server-with-kdenlive/)\n  * [CHRIS R MILLER](https://chrisrmiller.com/2019/05/29/integrate-appimages-into-your-linux-distro/) (English)\n  * [doLys Forum](https://dolys.fr/forums/topic/gerer-les-appimage-sous-linux/) (French)\n  * [LINUXUSER](https://linux-user.gr/t/eykolh-chrhsh-efarmogwn-appimage/2066) (Greek)\n\n\n## Installation\n\n### System-wide Installation\n\nAppImageLauncher integrates deeply into the system. Therefore, an installation via native system packages is the preferred way to install AppImageLauncher. This way, AppImageLauncher's package can perform the necessary steps to have your system use it for all AppImage invocations.\n\nCompatibility table (likely incomplete.) Please, feel free to open PRs to add distributions.\n\n| Release filename | Build system | Compatible distributions (incomplete) |\n| ---------------- | ------------ | ------------------------------------- |\n| `appimagelauncher-<version>.xenial_(amd64,i386).deb` | Ubuntu Xenial | Ubuntu Xenial (16.04), Debian Stretch (9), Netrunner 17.01 |\n| `appimagelauncher-<version>.bionic_(amd64,i386).deb` | Ubuntu Bionic | Ubuntu Bionic (18.04), Ubuntu Disco (19.04), Ubuntu Eoan (19.10) and newer, Debian buster (10) and newer, Netrunner 19.01, 19.08 and newer, LMDE 6 \"Faye\" |\n| ~~`appimagelauncher-<version>.disco_(amd64,i386).deb`~~  | ~~Ubuntu Disco~~  | ~~Ubuntu Disco (19.04)~~ |\n| ~~`appimagelauncher-<version>.eoan_(amd64,i386).deb`~~   | ~~Ubuntu Eoan~~   | ~~Ubuntu Eoan (19.10) and newer~~ |\n| ~~`appimagelauncher-<version>.buster_(amd64,i386).deb`~~ | ~~Debian Buster~~ | ~~Debian Buster (10) and newer, Netrunner 19.01 and 19.08~~ |\n| `appimagelauncher-<version>.(i386,x86_64).rpm`       | Ubuntu Xenial | openSUSE Leap 42 and newer, possibly openSUSE Tumbleweed, SUSE Enterprise Linux, RHEL 7, CentOS 7 |\n\n  - Ubuntu Trusty (14.04) and newer\n    - **Important:** Ubuntu Bionic (and newer) broke with the backwards compatibility of its `libcurl` packages, therefore users of these systems need to install the special `bionic` package\n  - Debian stable (Jessie, 8) and newer\n  - Netrunner 17 and newer\n  - openSUSE Leap 42 and newer\n  - openSUSE Tumbleweed\n\nThe installation of packages on systems with a set of packages similar to one of the listed ones (e.g., Linux Mint, Fedora, etc.) should work as well.\n\nManjaro and Netrunner Rolling users can install AppImageLauncher with a distribution-provided package called `appimagelauncher`.\n\nArch Linux, Manjaro, Antergos and Netrunner Rolling users can use AUR to install AppImageLauncher by installing [appimagelauncher](https://aur.archlinux.org/packages/appimagelauncher) or [appimagelauncher-git](https://aur.archlinux.org/packages/appimagelauncher-git) (possibly broken, see [#574](https://github.com/TheAssassin/AppImageLauncher/issues/574)) (thanks @NuLogicSystems for setting up the build). \n\nOther systems derived from the listed ones, such as for instance Linux Mint (Ubuntu), should support AppImageLauncher as well.\nIf they don't, please don't hesitate to create an issue.\n\n**Note:** Feel free to request support for other distributions by [opening an issue](https://github.com/TheAssassin/AppImageLauncher/issues/new).\n\n\n### Build from source\n\nBuild instructions in [BUILD.md](BUILD.md).\n\n\n## Background\n\nTechnical details about how AppImageLauncher registers itself on [this wiki page](https://github.com/TheAssassin/AppImageLauncher/wiki/Idea).\n"
  },
  {
    "path": "ci/.dockerignore",
    "content": "*\n!install-deps.sh\n"
  },
  {
    "path": "ci/Dockerfile",
    "content": "FROM ubuntu:jammy\n\n# tell scripts that we're building in an automated release scenario\nENV CI=1\n\n# we re-use the DOCKER_PLATFORM to tell the build scripts about the build target architecture without the need to use uname\n# the build scripts will have to map the architecture to names Debian/RPM/AppImage support\nARG DOCKER_PLATFORM\nENV DOCKER_PLATFORM=\"${DOCKER_PLATFORM}\"\n\n# we need to provide some writable $HOME for the (random) used ID we use in the build script\nRUN install -d -m 0777 /home/user\nENV HOME=/home/user\n\n# let the install script do the heavy lifting (easier than replicating the complex behavior in a Dockerfile)\nCOPY install-deps.sh /\nRUN bash -xe install-deps.sh\n"
  },
  {
    "path": "ci/build-docker-image.sh",
    "content": "#! /bin/bash\n\nif [[ \"$DOCKER_PLATFORM\" == \"\" ]]; then\n    echo \"Usage: env DOCKER_PLATFORM=... bash $0\"\n    exit 1\nfi\n\nset -euo pipefail\n\n# the other script sources this script, therefore we have to support that use case\nif [[ \"${BASH_SOURCE[*]}\" != \"\" ]]; then\n    this_dir=\"$(readlink -f \"$(dirname \"${BASH_SOURCE[0]}\")\")\"\nelse\n    this_dir=\"$(readlink -f \"$(dirname \"$0\")\")\"\nfi\n\n# we need a \"docker-container\" type builder to make use of all the buildx features regarding caching and multi-arch\n# support\nbuilder_name=\"appimagelauncher-builder\"\nif ! docker buildx inspect \"$builder_name\" &>/dev/null; then\n    echo \"Docker builder $builder_name not found, creating\"\n    docker buildx create --name=\"$builder_name\" --driver=docker-container --bootstrap\nelse\n    echo \"Using existing Docker builder $builder_name found\"\nfi\n\nimage=ghcr.io/theassassin/appimagelauncher-build\nbranch=\"$(git rev-parse --abbrev-ref HEAD | tr -c 'A-Za-z0-9-' '_')\"\n# append platform to Docker image tag since we can't push separate (multi-arch) images to the same name without\n# creating the manifest manually\n# see https://github.com/docker/build-push-action/issues/671\nplatform_suffix=\"$(echo -n \"$DOCKER_PLATFORM\" | tr -c 'A-Za-z0-9-' '_')\"\n\ncurrent_branch_tag=\"${image}:${branch}_${platform_suffix}\"\nmaster_branch_tag=\"${image}:master_${platform_suffix}\"\n\ndocker_command=(\n    docker buildx build\n    --builder \"$builder_name\"\n    --load  # --output=type=docker\n    --pull\n    --platform \"$DOCKER_PLATFORM\"\n    --build-arg DOCKER_PLATFORM=\"$DOCKER_PLATFORM\"\n\n    # cache from the current branch's image\n    --cache-from type=registry,ref=\"$current_branch_tag\"\n\n    # we can always cache from the master branch's image\n    --cache-from type=registry,ref=\"$master_branch_tag\"\n\n    --tag \"$current_branch_tag\"\n)\n\n# if we are building on GitHub actions, we can also push the resulting image\n# we skip pull request builds, though; regular branch builds will push the built images (if possible)\n# also, skip Dependabot builds, it is not allowed to push images\nif [[ \"${GITHUB_ACTIONS:-}\" != \"\" ]] && [[ \"${GITHUB_EVENT_NAME:-}\" != \"pull_request\" ]] && [[ \"${GITHUB_ACTOR:-}\" != \"dependabot\"* ]]; then\n    echo \"Going to push built image\"\n    docker_command+=(\n        --cache-to type=inline\n        --push\n    )\nfi\n\ndocker_command+=(\n   \"$this_dir\"\n)\n\n# using inline cache to speed up builds by fetching the image from the GitHub registry first\n# this should speed up local builds as well\n# if the image hasn't changed, this should be a no-op\n\"${docker_command[@]}\"\n"
  },
  {
    "path": "ci/build-in-docker.sh",
    "content": "#! /bin/bash\n\nif [[ \"$DOCKER_PLATFORM\" == \"\" ]]; then\n    echo \"Usage: env DOCKER_PLATFORM=... bash $0\"\n    exit 1\nfi\n\nset -x\nset -euo pipefail\n\ncd \"$(readlink -f \"$(dirname \"${BASH_SOURCE[0]}\")\")\"\n\n# sets variables $image, $dockerfile\nsource build-docker-image.sh\n\nDOCKER_OPTS=()\n# fix for https://stackoverflow.com/questions/51195528/rcc-error-in-resource-qrc-cannot-find-file-png\nif [ \"${CI:-}\" != \"\" ]; then\n    DOCKER_OPTS+=(\"--security-opt\" \"seccomp:unconfined\")\nfi\n\n# only if there's more than 3G of free space in RAM, we can build in a RAM disk\nif [[ \"${GITHUB_ACTIONS:-}\" != \"\" ]]; then\n    echo \"Building on GitHub actions, which does not support --tmpfs flag -> building on regular disk\"\nelif [[ \"$(env LC_ALL=C free -m  | grep \"Mem:\" | awk '{print $4}')\" -gt 3072 ]]; then\n    echo \"Host system has enough free memory -> building in RAM disk\"\n    DOCKER_OPTS+=(\"--tmpfs\" \"/docker-ramdisk:exec,mode=777\")\nelse\n    echo \"Host system does not have enough free memory -> building on regular disk\"\nfi\n\n[[ -t 0 ]] && DOCKER_OPTS+=(\"-t\")\n\n# run the build with the current user to\n#   a) make sure root is not required for builds\n#   b) allow the build scripts to \"mv\" the binaries into the /out directory\nuid=\"$(id -u)\"\n# run build\ndocker run --platform \"$DOCKER_PLATFORM\" -e BUILD_LITE -e DIST -e ARCH -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ID --rm -i --user \"$uid\" -w /ws -e CI=1 \\\n     \"${DOCKER_OPTS[@]}\" \\\n     -v \"$(readlink -f ..):/ws\" \\\n     \"$current_branch_tag\" \\\n     bash ci/build.sh\n\n"
  },
  {
    "path": "ci/build.sh",
    "content": "#! /bin/bash\n\nset -euo pipefail\n\n# use RAM disk if possible\nif [ -d /dev/shm ] && mount | grep /dev/shm | grep -v -q noexec; then\n    TEMP_BASE=/dev/shm\nelif [ -d /docker-ramdisk ]; then\n    TEMP_BASE=/docker-ramdisk\nelse\n    TEMP_BASE=/tmp\nfi\n\nBUILD_DIR=\"$(mktemp -d -p \"$TEMP_BASE\" AppImageLauncher-build-XXXXXX)\"\n\ncleanup () {\n    if [ -d \"$BUILD_DIR\" ]; then\n        rm -rf \"$BUILD_DIR\"\n    fi\n}\n\ntrap cleanup EXIT\n\n# store repo root as variable\nREPO_ROOT=\"$(readlink -f \"$(dirname \"${BASH_SOURCE[0]}\")\"/..)\"\nOLD_CWD=\"$(readlink -f .)\"\n\npushd \"$BUILD_DIR\"\n\n# list available versions of Qt to be able to choose the right one for the build\ncat <<\\EOF\n##########################\n# Available Qt versions: #\n##########################\nEOF\nqtchooser -list-versions\necho\n\n# the Docker images provide a clang/clang++ symlink to the actual clang[++] binaries\n# see install-deps.sh for more information\ncmake_args=(\n    \"-DCMAKE_C_COMPILER=clang\"\n    \"-DCMAKE_CXX_COMPILER=clang++\"\n    \"-DCMAKE_INSTALL_PREFIX=/usr\"\n    \"-DCMAKE_BUILD_TYPE=RelWithDebInfo\"\n    \"-DBUILD_TESTING=OFF\"\n    \"-DCMAKE_BUILD_TYPE=RelWithDebInfo\"\n    # TODO: we don't necessarily want to hardcode this here\n    \"-DBINFMT_INTERPRETER_PATH_PREPEND_LD_P_NATIVE_PACKAGES_PREFIX=/opt/appimagelauncher.AppDir/\"\n)\n\nif [[ \"${BUILD_LITE:-}\" == \"\" ]]; then\n    cmake_args+=(\"-DENABLE_UPDATE_HELPER=ON\")\nelse\n    cmake_args+=(\"-DBUILD_LITE=ON\")\nfi\n\nexport QT_SELECT=qt5\n\ncmake \"$REPO_ROOT\" \"${cmake_args[@]}\"\n\nmake -j$(nproc)\n\n# prepare AppDir\nmake install DESTDIR=AppDir\n\nARCH=\"$(dpkg --print-architecture)\"\n\n# \"translate\" to linuxdeploy/AppImage architecture\n# note: linuxdeploy and AppImage differ in i386/i686, but we don't support that any more anyway\ncase \"$ARCH\" in\n    amd64)\n        ARCH=x86_64\n        ;;\n    arm64)\n        ARCH=aarch64\n        ;;\nesac\n\n# build release formats\ncurl -LO https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-\"$ARCH\".AppImage\ncurl -LO https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-\"$ARCH\".AppImage\n\nVERSION=$(src/cli/ail-cli --version | awk '{print $3}')\n\ngha_build=\"${GITHUB_RUN_NUMBER:-}\"\n\nif [[ \"$gha_build\" != \"\" ]]; then\n    VERSION=\"${VERSION}-gha${gha_build}\"\nelse\n    VERSION=\"${VERSION}-local\"\nfi\n\n# should be overwritten for every output plugin below, this is a fallback only\nexport LINUXDEPLOY_OUTPUT_APP_NAME=appimagelauncher\n\nLINUXDEPLOY_OUTPUT_VERSION=\"${VERSION}~$(cd \"$REPO_ROOT\" && git rev-parse --short HEAD)\"\nexport LINUXDEPLOY_OUTPUT_VERSION\n\nexport APPIMAGE_EXTRACT_AND_RUN=1\n\nlinuxdeploy_extra_args=()\n\nif [[ \"${BUILD_LITE:-}\" == \"\" ]]; then\n    # configure linuxdeploy-plugin-native_packages\n    export LDNP_PACKAGE_NAME=appimagelauncher\n\n    export LDNP_BUILD=\"deb rpm\"\n    export LDNP_DESCRIPTION=\"\"\n    export LDNP_SHORT_DESCRIPTION=\"\"\n\n    rpm_lib_suffix=\"\"\n\n    case \"$ARCH\" in\n        x86_64)\n            rpm_build_arch=x86_64\n            rpm_lib_suffix=\"()(64bit)\"\n            deb_build_arch=amd64\n            ;;\n        i?86)\n            rpm_build_arch=i386\n            deb_build_arch=i386\n            ;;\n        aarch64)\n            rpm_build_arch=aarch64\n            deb_build_arch=arm64\n            ;;\n        armhf)\n            deb_build_arch=armhf\n            rpm_build_arch=armv7hl\n            ;;\n        *)\n            echo \"Unsupported architecture: $ARCH\"\n            exit 2\n            ;;\n    esac\n\n    # common meta info\n    export LDNP_META_URL=\"https://github.com/TheAssassin/AppImageLauncher\"\n    export LDNP_META_BUG_URL=\"https://github.com/TheAssassin/AppImageLauncher/issues\"\n    export LDNP_META_VENDOR=\"TheAssassin\"\n\n    export LDNP_META_DEB_DEPENDS=\"systemd, libgl1, libfontconfig1, libharfbuzz0b, libfribidi0\"\n    export LDNP_META_DEB_ARCHITECTURE=\"$deb_build_arch\"\n    export LDNP_META_DEB_PRE_DEPENDS=\"bash\"\n    export LDNP_DEB_EXTRA_DEBIAN_FILES=\"${BUILD_DIR}/cmake/debian/postinst;${BUILD_DIR}/cmake/debian/postrm\"\n\n    rpm_requires=(\n        \"systemd\"\n        \"libGL.so.1${rpm_lib_suffix}\"\n        \"libfontconfig.so.1${rpm_lib_suffix}\"\n        \"libfreetype.so.6${rpm_lib_suffix}\"\n        \"libfribidi.so.0${rpm_lib_suffix}\"\n        \"libgpg-error.so.0${rpm_lib_suffix}\"\n        \"libharfbuzz.so.0${rpm_lib_suffix}\"\n    )\n    export LDNP_META_RPM_REQUIRES=\"${rpm_requires[*]}\"\n    export LDNP_META_RPM_BUILD_ARCH=\"$rpm_build_arch\"\n    export LDNP_RPM_SCRIPTLET_POST=\"${BUILD_DIR}/cmake/debian/postinst\"\n    export LDNP_RPM_SCRIPTLET_PREUN=\"${BUILD_DIR}/cmake/debian/postrm\"\n\n    # updater is not available for the lite build\n    linuxdeploy_extra_args+=(\n        -e \"$(find AppDir/usr/lib/*/appimagelauncher/update | head -n1)\"\n        --output native_packages\n    )\n\n    # tools like pipx would have side effects on the build host and it's generally a bit overkill for our purpose\n    if which python3.13 &> /dev/null; then\n        # python3.13, installed from the deadsnakes PPA for the Docker builds\n        python3() {\n            python3.13 \"$@\"\n        }\n    fi\n    python3 -m venv venv\n    venv/bin/pip install git+https://github.com/linuxdeploy/linuxdeploy-plugin-native_packages\n    export PATH=\"$PWD/venv/bin:$PATH\"\nelse\n    linuxdeploy_extra_args+=(\n        --custom-apprun \"$REPO_ROOT\"/resources/appimagelauncher-lite-AppRun.sh\n        --output appimage\n    )\n\n    LDAI_OUTPUT=\"$(echo appimagelauncher-lite-\"$VERSION\"-\"$ARCH\".AppImage | tr '~' -)\"\n    export LDAI_OUTPUT\n\n    # since we extracted common parts from the installer built into the AppRun script, we have to copy the \"library\" script\n    # before building an AppImage\n    install \"$REPO_ROOT\"/resources/appimagelauncher-lite-installer-common.sh \"$(readlink -f AppDir/)\"\nfi\n\nchmod -v +x linuxdeploy*-\"$ARCH\".AppImage\n\n# workaround for QEMU\nfor appimage in *.AppImage; do\n    dd if=/dev/zero bs=1 count=3 seek=8 conv=notrunc of=\"$appimage\"\ndone\n\nldd AppDir/usr/bin/AppImageLauncherSettings\n\n./linuxdeploy-\"$ARCH\".AppImage -v0 \\\n    --appdir \"$(readlink -f AppDir)\" \\\n    --plugin qt \\\n    -d AppDir/usr/share/applications/appimagelauncher.desktop \\\n    -e \"$(find AppDir/usr/lib/*/appimagelauncher/remove | head -n1)\" \\\n    \"${linuxdeploy_extra_args[@]}\"\n\nif [[ \"${BUILD_LITE:-}\" == \"\" ]]; then\n    mv \"$LDNP_PACKAGE_NAME\"*.{rpm,deb} \"$OLD_CWD\"\nelse\n    mv \"$LDAI_OUTPUT\" \"$OLD_CWD\"\nfi\n"
  },
  {
    "path": "ci/install-deps.sh",
    "content": "#! /bin/bash\n\nset -euo pipefail\n\nif [[ \"$DOCKER_PLATFORM\" == \"\" ]]; then\n    echo \"Usage: env DOCKER_PLATFORM=... bash $0\"\n    exit 2\nfi\n\nif [[ \"$CI\" == \"\" ]]; then\n    echo \"Caution: this script is supposed to run inside a (disposable) CI environment\"\n    echo \"It will alter a system, and should not be run on workstations or alike\"\n    echo \"You can export CI=1 to prevent this error from being shown again\"\n    exit 3\nfi\n\ncase \"$DOCKER_PLATFORM\" in\n    linux/amd64|linux/arm/v7|linux/arm64/v8)\n        ;;\n    *)\n        echo \"Error: unsupported architecture: $DOCKER_PLATFORM\"\n        exit 4\n        ;;\nesac\n\nset -x\n\n# this array collects all the packages we want to install\n# running as few operations as possible is a runtime optimization\npackages=()\n\n# install 32-bit build dependencies and multilib/cross compilers for binfmt-bypass's 32-bit preload library\n# must be done before apt-get update, otherwise the packages cannot be found during installation\nif [[ \"$DOCKER_PLATFORM\" == \"linux/amd64\" ]]; then\n    dpkg --add-architecture i386\n    packages+=(\n        libc6-dev:i386\n    )\nelif [[ \"$DOCKER_PLATFORM\" == \"linux/arm64/v8\" ]]; then\n    dpkg --add-architecture armhf\n    packages+=(\n        libc6-dev:armhf\n    )\nfi\n\nexport DEBIAN_FRONTEND=noninteractive\n\n# allow setup of PPA\napt-get update\napt-get install -y software-properties-common\n\n# we depend on the deadsnakes PPA to provide a sufficiently recent Python to linuxdeploy-plugin-native_packages\nadd-apt-repository -y ppa:deadsnakes/ppa\n\npackages=(\n    libcurl4-openssl-dev\n    libfuse-dev\n    desktop-file-utils\n    libglib2.0-dev\n    libcairo2-dev\n    libssl-dev\n    ca-certificates\n    libbsd-dev\n    qttools5-dev-tools\n    make\n    build-essential\n    git\n    automake\n    autoconf\n    libtool\n    patch\n    wget\n    curl\n    vim-common\n    desktop-file-utils\n    pkg-config\n    libarchive-dev\n    libboost-filesystem-dev\n    librsvg2-dev\n    librsvg2-bin\n    libssl-dev\n    rpm\n    rpm2cpio\n    liblzma-dev\n\n    # cross-compiling for 32-bit is only really easy with clang, where we can specify the target as a compiler option\n    # clang -target arm-linux-gnueabihf ...\n    clang\n\n    qtbase5-dev\n    qt5-qmake\n    qtdeclarative5-dev\n\n    # libappimage\n    libgcrypt-dev\n    argagg-dev\n    nlohmann-json3-dev\n    libgpgme-dev\n    libzstd-dev\n\n    # linuxdeploy-plugin-native_packages\n    # see also above re. deadsnakes PPA\n    python3.13-venv\n)\n\n# headless install\nexport DEBIAN_FRONTEND=noninteractive\n\napt-get -y --no-install-recommends install \"${packages[@]}\"\n\n# install more recent CMake and patchelf\ncmake_arch=\"$(dpkg --print-architecture)\"\n\ncase \"$cmake_arch\" in\n    amd64)\n        cmake_arch=x86_64\n        ;;\n    arm64)\n        cmake_arch=aarch64\n        ;;\n    armhf)\n        patchelf_arch=armv7l\n        ;;\nesac\n\npatchelf_arch=\"${patchelf_arch:-$cmake_arch}\"\n\ncurl -L https://artifacts.assassinate-you.net/prebuilt-cmake/cmake-v3.29.6-ubuntu-jammy-\"${cmake_arch}\".tar.gz | \\\n    tar xz --strip-components=1 -C /usr\n\ncurl -L https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-\"$patchelf_arch\".tar.gz | tar xz -C/usr/local\n\n  # g{cc,++}-multilib usually install these dependencies for us\n  # however, as the multilib stuff is not available for ARM, we have to install these dev packages ourselves\n  # we can't really predict the names of the packages (they differ on different distros/releases)\n  # therefore, we have to install the other dependencies first to be able to query them with dpkg -l\nif [[ \"$DOCKER_PLATFORM\" == \"linux/arm64/v8\" ]] || [[ \"$DOCKER_PLATFORM\" == \"linux/amd64\" ]]; then\n    if [[ \"$DOCKER_PLATFORM\" == \"linux/amd64\" ]]; then\n        arch_32bit=i386\n    elif [[ \"$DOCKER_PLATFORM\" == \"linux/arm64/v8\" ]]; then\n        arch_32bit=armhf\n    else\n        echo \"Cannot determine 32-bit architecture matching 64-bit architecture $ARCH\"\n        exit 6\n    fi\n\n    apt-get install -y \\\n        \"$(dpkg -l | grep libgcc | grep dev | awk '{print $2}' | cut -d: -f1 | uniq)\":\"$arch_32bit\" \\\n        \"$(dpkg -l | grep libstdc++ | grep dev | awk '{print $2}' | cut -d: -f1 | uniq)\":\"$arch_32bit\"\nfi\n"
  },
  {
    "path": "cmake/install.cmake",
    "content": "# required by file(CHMOD ...)\ncmake_minimum_required(VERSION 3.19)\n\n# define private libraries install destination\ninclude(GNUInstallDirs)\n\n# debugging: libdir should be lib/<triplet>\nmessage(STATUS \"CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}\")\n\nif(NOT IS_ABSOLUTE ${CMAKE_INSTALL_LIBDIR})\n    set(_libdir ${CMAKE_INSTALL_LIBDIR})\nelse()\n    file(RELATIVE_PATH _libdir ${CMAKE_INSTALL_LIBDIR} ${CMAKE_INSTALL_PREFIX})\nendif()\n\nset(_private_libdir ${_libdir}/appimagelauncher)\n\n# calculate relative path from binary install destination to private library install dir\nif(NOT IS_ABSOLUTE ${CMAKE_INSTALL_BINDIR})\n    set(_bindir ${CMAKE_INSTALL_BINDIR})\nelse()\n    file(RELATIVE_PATH _bindir ${CMAKE_INSTALL_BINDIR} ${CMAKE_INSTALL_PREFIX})\n    #set(_bindir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})\nendif()\n\nset(_abs_bindir ${CMAKE_INSTALL_PREFIX}/${_bindir})\nset(_abs_private_libdir ${CMAKE_INSTALL_PREFIX}/${_private_libdir})\n\nfile(RELATIVE_PATH _rpath ${_abs_bindir} ${_abs_private_libdir})\nset(_rpath \"\\$ORIGIN/${_rpath}\")\n\n# install libappimage.so into lib/appimagekit to avoid overwriting a libappimage potentially installed into /usr/lib\n# or /usr/lib/x86_64-... or wherever the OS puts its libraries\ninstall(\n    TARGETS libappimage\n    LIBRARY DESTINATION \"${_private_libdir}\" COMPONENT APPIMAGELAUNCHER\n)\n\nif(ENABLE_UPDATE_HELPER)\n    install(\n        TARGETS libappimageupdate libappimageupdate-qt\n        LIBRARY DESTINATION \"${_private_libdir}\" COMPONENT APPIMAGELAUNCHER\n    )\nendif()\n\noption(BINFMT_INTERPRETER_PATH_PREPEND_LD_P_NATIVE_PACKAGES_PREFIX \"\")\n\nif(NOT BUILD_LITE)\n    # unfortunately, due to a cyclic dependency, we need to hardcode parts of this variable, which is included in the\n    # install scripts and the binfmt.d config\n    set(BINFMT_INTERPRETER_PATH ${CMAKE_INSTALL_PREFIX}/${_private_libdir}/binfmt-interpreter)\n\n    if(BINFMT_INTERPRETER_PATH_PREPEND_LD_P_NATIVE_PACKAGES_PREFIX)\n        message(STATUS \"Prepending prefix ${BINFMT_INTERPRETER_PATH_PREPEND_LD_P_NATIVE_PACKAGES_PREFIX} to binfmt interpreter path\")\n        set(BINFMT_INTERPRETER_PATH \"${BINFMT_INTERPRETER_PATH_PREPEND_LD_P_NATIVE_PACKAGES_PREFIX}${BINFMT_INTERPRETER_PATH}\")\n    endif()\n\n    # according to https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html, we must make sure the\n    # interpreter string does not exceed 127 characters\n    set(BINFMT_INTERPRETER_PATH_LENGTH_MAX 127)\n    string(LENGTH BINFMT_INTERPRETER_PATH BINFMT_INTERPRETER_PATH_LENGTH)\n\n    if(BINFMT_INTERPRETER_PATH_LENGTH GREATER BINFMT_INTERPRETER_PATH_LENGTH_MAX)\n        message(FATAL_ERROR \"interpreter path exceeds maximum length of ${BINFMT_INTERPRETER_PATH_LENGTH_MAX}\")\n    endif()\n\n    # binfmt.d config file -- used as a fallback, if update-binfmts is not available\n    configure_file(\n        ${PROJECT_SOURCE_DIR}/resources/binfmt.d/appimagelauncher.conf.in\n        ${PROJECT_BINARY_DIR}/resources/binfmt.d/appimagelauncher.conf\n        @ONLY\n    )\n    # caution: don't use ${CMAKE_INSTALL_LIBDIR} here, it's really just lib/binfmt.d\n    install(\n        FILES ${PROJECT_BINARY_DIR}/resources/binfmt.d/appimagelauncher.conf\n        DESTINATION lib/binfmt.d COMPONENT APPIMAGELAUNCHER\n    )\n\n    # prepare postinst and prerm hooks to Debian package\n    configure_file(\n        ${PROJECT_SOURCE_DIR}/resources/install-scripts/post-install.in\n        ${PROJECT_BINARY_DIR}/cmake/debian/postinst\n        @ONLY\n    )\n    configure_file(\n        ${PROJECT_SOURCE_DIR}/resources/install-scripts/post-uninstall.in\n        ${PROJECT_BINARY_DIR}/cmake/debian/postrm\n        @ONLY\n    )\nendif()\n\n# install systemd service configuration for appimagelauncherd\nconfigure_file(\n    ${PROJECT_SOURCE_DIR}/resources/appimagelauncherd.service.in\n    ${PROJECT_BINARY_DIR}/resources/appimagelauncherd.service\n    @ONLY\n)\n# caution: don't use ${CMAKE_INSTALL_LIBDIR} here, it's really just lib/systemd/user\ninstall(\n    FILES ${PROJECT_BINARY_DIR}/resources/appimagelauncherd.service\n    DESTINATION lib/systemd/user/ COMPONENT APPIMAGELAUNCHER\n)\n"
  },
  {
    "path": "cmake/modules/FindINotify.cmake",
    "content": "find_path(INOTIFY_INCLUDE_DIR sys/inotify.h PATH_SUFFIXES inotify)\nfind_library(INOTIFY_LIBRARY inotify)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(INotify DEFAULT_MSG INOTIFY_INCLUDE_DIR)\n\nIF(INOTIFY_FOUND)\n  set(INotify_INCLUDE_DIRS ${INOTIFY_INCLUDE_DIR})\n\n  add_library(inotify IMPORTED INTERFACE)\n  set_property(TARGET inotify PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INOTIFY_INCLUDE_DIRS})\nENDIF(INOTIFY_FOUND)\n"
  },
  {
    "path": "cmake/reproducible_builds.cmake",
    "content": "# this little snippet makes sure that no absolute paths end up in the binaries built by CMake\n# it will replace such paths with relative ones\n# see https://reproducible-builds.org/docs/build-path/ for more information\n\ncmake_minimum_required(VERSION 3.5)\n\ninclude(CheckCCompilerFlag)\n\nif(CMAKE_BUILD_TYPE STREQUAL Release)\n    message(STATUS \"Release build detected, enabling reproducible builds mode\")\n    get_filename_component(abs_source_path ${PROJECT_SOURCE_DIR} ABSOLUTE)\n    file(RELATIVE_PATH rel_source_path ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR})\n\n    set(map_fix ${abs_source_path}=${rel_source_path})\n\n    # can only add flags when the compiler supports them\n    # known working compilers: GCC >= 8\n    foreach(type debug macro)\n        set(flag_name -f${type}-prefix-map)\n        set(flags ${flag_name}=${map_fix})\n\n        check_c_compiler_flag(${flags} ${type}_prefix_map_flag_available)\n\n        if(${type}_prefix_map_flag_available)\n            set(extra_flags \"${extra_flags} ${flags}\")\n        else()\n            message(WARNING \"${flag_name} not available, cannot enable full reproducible builds mode\")\n        endif()\n    endforeach()\n\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} ${extra_flags}\")\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${extra_flags}\")\n    set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} ${extra_flags}\")\nendif()\n"
  },
  {
    "path": "cmake/scripts.cmake",
    "content": "# borrowed from libappimage\nif(NOT COMMAND check_program)\n    function(check_program)\n        set(keywords FORCE_PREFIX)\n        set(oneValueArgs NAME)\n        cmake_parse_arguments(ARG \"${keywords}\" \"${oneValueArgs}\" \"\" \"${ARGN}\")\n\n        if(NOT ARG_NAME)\n            message(FATAL_ERROR \"NAME argument required for check_program\")\n        endif()\n\n        if(TOOLS_PREFIX)\n            set(prefix ${TOOLS_PREFIX})\n        endif()\n\n        message(STATUS \"Checking for program ${ARG_NAME}\")\n\n        string(TOUPPER ${ARG_NAME} name_upper)\n\n        if(prefix)\n            # try prefixed version first\n            find_program(${name_upper} ${prefix}${ARG_NAME})\n        endif()\n\n        # try non-prefixed version\n        if(NOT ${name_upper})\n            if(TOOLS_PREFIX AND ARG_FORCE_PREFIX)\n                message(FATAL_ERROR \"TOOLS_PREFIX set, but could not find program with prefix in PATH (FORCE_PREFIX is set)\")\n            endif()\n\n            find_program(${name_upper} ${ARG_NAME})\n\n            if(NOT ${name_upper})\n                message(FATAL_ERROR \"Could not find required program ${ARG_NAME}.\")\n            endif()\n        endif()\n\n        message(STATUS \"Found program ${ARG_NAME}: ${${name_upper}}\")\n\n        mark_as_advanced(${name_upper})\n    endfunction()\nendif()\n"
  },
  {
    "path": "cmake/toolchains/i386-linux-gnu.cmake",
    "content": "# this toolchain file works for cross compiling on Ubuntu when the following prerequisites are given:\n# - all dependencies that would be needed for a normal build must be installed as i386 versions\n# - building XZ/liblzma doesn't work yet, so one has to install liblzma-dev:i386 and set -DUSE_SYSTEM_XZ=ON\n# - building GTest doesn't work yet, so one has to install libgtest-dev:i386 and set -DUSE_SYSTEM_GTEST=ON\n# - building libarchive doesn't work yet, so one has to install liblzma-dev:i386 and set -DUSE_SYSTEM_LIBARCHIVE=ON (TODO: link system libarchive statically like liblzma)\n# some of the packets interfere with their x86_64 version (e.g., libfuse-dev:i386, libglib2-dev:i386), so building on a\n# normal system will most likely not work, but on systems like Travis it should work fine\n\nset(CMAKE_SYSTEM_NAME Linux CACHE STRING \"\" FORCE)\nset(CMAKE_SYSTEM_PROCESSOR i386 CACHE STRING \"\" FORCE)\n\nset(CMAKE_C_FLAGS \"-m32\" CACHE STRING \"\" FORCE)\nset(CMAKE_CXX_FLAGS \"-m32\" CACHE STRING \"\" FORCE)\n\n# CMAKE_SHARED_LINKER_FLAGS, CMAKE_STATIC_LINKER_FLAGS etc. must not be set, but CMAKE_EXE_LINKER_FLAGS is necessary\nset(CMAKE_EXE_LINKER_FLAGS \"-m32\" CACHE STRING \"\" FORCE)\n\nset(DEPENDENCIES_CFLAGS \"-m32\" CACHE STRING \"\" FORCE)\nset(DEPENDENCIES_CPPFLAGS \"-m32\" CACHE STRING \"\" FORCE)\nset(DEPENDENCIES_LDFLAGS \"-m32\" CACHE STRING \"\" FORCE)\n\n# host = target system\n# build = build system\n# both must be specified\nset(EXTRA_CONFIGURE_FLAGS \"--host=i686-pc-linux-gnu\" \"--build=x86_64-pc-linux-gnu\" CACHE STRING \"\" FORCE)\n\n# may help with some rare issues\nset(CMAKE_PREFIX_PATH /usr/lib/i386-linux-gnu CACHE STRING \"\" FORCE)\n\n# makes sure that at least on Ubuntu pkg-config will search for the :i386 packages\nset(ENV{PKG_CONFIG_PATH} /usr/lib/i386-linux-gnu/pkgconfig/ CACHE STRING \"\" FORCE)\n\n# make qtchooser find qt5\nset(ENV{QT_SELECT} qt5 CACHE STRING \"\" FORCE)\n"
  },
  {
    "path": "cmake/versioning.cmake",
    "content": "set(V_MAJOR 3)\nset(V_MINOR 0)\nset(V_PATCH 0)\nset(V_SUFFIX \"-beta-2\")\n\nset(APPIMAGELAUNCHER_VERSION ${V_MAJOR}.${V_MINOR}.${V_PATCH}${V_SUFFIX})\n\n# check whether git is available\nfind_program(GIT git)\nset(GIT_COMMIT_CACHE_FILE \"${PROJECT_SOURCE_DIR}/cmake/GIT_COMMIT\")\n\nif(NOT GIT STREQUAL \"GIT-NOTFOUND\")\n    # read Git revision ID\n    # WARNING: this value will be stored in the CMake cache\n    # to update it, you will have to reset the CMake cache\n    # (doesn't matter for CI builds like Travis for instance, where there's no permanent CMake cache)\n    execute_process(\n        COMMAND git rev-parse --short HEAD\n        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}\n        OUTPUT_VARIABLE APPIMAGELAUNCHER_GIT_COMMIT\n        OUTPUT_STRIP_TRAILING_WHITESPACE\n        ERROR_QUIET\n        RESULT_VARIABLE GIT_RESULT\n    )\n\n    if(GIT_RESULT EQUAL 0)\n        message(STATUS \"Storing git commit ID in cache file\")\n        file(WRITE \"${GIT_COMMIT_CACHE_FILE}\" \"${APPIMAGELAUNCHER_GIT_COMMIT}\")\n    endif()\nendif()\n\nif(NOT GIT_RESULT EQUAL 0)\n    # git call failed or git hasn't been found, might happen when calling CMake in an extracted source tarball\n    # therefore we try to find the git commit cache file\n    # if it doesn't exist, refuse to configure\n\n    message(WARNING \"Failed to gather commit ID via git command, trying to read cache file\")\n    if(EXISTS \"${GIT_COMMIT_CACHE_FILE}\")\n        file(READ \"${GIT_COMMIT_CACHE_FILE}\" APPIMAGELAUNCHER_CACHED_GIT_COMMIT)\n        mark_as_advanced(FORCE APPIMAGELAUNCHER_CACHED_GIT_COMMIT)\n        string(REPLACE \"\\n\" \"\" APPIMAGELAUNCHER_GIT_COMMIT \"${APPIMAGELAUNCHER_CACHED_GIT_COMMIT}\")\n    else()\n        message(FATAL_ERROR \"Could not find git commit cache file, git commit ID not available for versioning\")\n    endif()\nendif()\n\nif(\"${APPIMAGELAUNCHER_GIT_COMMIT}\" STREQUAL \"\")\n    message(FATAL_ERROR \"Invalid git commit ID: ${APPIMAGELAUNCHER_GIT_COMMIT}\")\nendif()\n\nmessage(STATUS \"Git commit: ${APPIMAGELAUNCHER_GIT_COMMIT}\")\nmark_as_advanced(FORCE APPIMAGELAUNCHER_GIT_COMMIT)\n\n# add build number based on GitHub actions build number if possible\nif(\"$ENV{GITHUB_RUN_NUMBER}\" STREQUAL \"\")\n    set(APPIMAGELAUNCHER_BUILD_NUMBER \"<local dev build>\")\nelse()\n    set(APPIMAGELAUNCHER_BUILD_NUMBER \"$ENV{GITHUB_RUN_NUMBER}\")\nendif()\n\n# get current date\nexecute_process(\n    COMMAND env LC_ALL=C date -u \"+%Y-%m-%d %H:%M:%S %Z\"\n    OUTPUT_VARIABLE APPIMAGELAUNCHER_BUILD_DATE\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n)\n\nadd_definitions(-DAPPIMAGELAUNCHER_VERSION=\"${APPIMAGELAUNCHER_VERSION}\")\nadd_definitions(-DAPPIMAGELAUNCHER_GIT_COMMIT=\"${APPIMAGELAUNCHER_GIT_COMMIT}\")\nadd_definitions(-DAPPIMAGELAUNCHER_BUILD_NUMBER=\"${APPIMAGELAUNCHER_BUILD_NUMBER}\")\nadd_definitions(-DAPPIMAGELAUNCHER_BUILD_DATE=\"${APPIMAGELAUNCHER_BUILD_DATE}\")\n"
  },
  {
    "path": "i18n/CMakeLists.txt",
    "content": "# lupdate must be installed and available\ncheck_program(NAME lupdate)\ncheck_program(NAME lrelease)\n\n# create target calling custom commands\nadd_custom_target(i18n)\n\n# create/update AppImageLauncher strings\nfunction(ail_generate_translations)\n    if(ARGC LESS 2)\n        message(ERROR \"ail_generate_translations called with wrong amount of arguments\")\n    endif()\n\n    add_custom_command(\n        TARGET i18n POST_BUILD\n        COMMAND ${LUPDATE} \"${ARGV0}\" -ts \"${ARGV1}\" -locations relative\n        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n    )\nendfunction()\n\nail_generate_translations(../src/ ui.en.ts)\n\nfile(GLOB TS_FILES *.ts)\n\nforeach(TS_FILE IN LISTS TS_FILES)\n    get_filename_component(TS_FILENAME ${TS_FILE} NAME)\n    ail_generate_translations(../src/ ${TS_FILENAME})\nendforeach()\n\nadd_custom_command(\n    TARGET i18n POST_BUILD\n    COMMAND ./auto-translate.py ui.en.ts\n    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n)\n\n\nadd_custom_target(l10n ALL)\n\n# generate Qt qm files from translation source files\nfunction(ail_generate_qm)\n    if(ARGC LESS 2)\n        message(ERROR \"ail_generate_translations called with wrong amount of arguments\")\n    endif()\n\n    add_custom_command(\n        TARGET l10n POST_BUILD\n        COMMAND ${LRELEASE} \"${ARGV0}\" -qm \"${ARGV1}\"\n        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n    )\nendfunction()\n\nfile(GLOB TS_FILES *.ts)\n\nset(target_dir ${CMAKE_CURRENT_BINARY_DIR}/generated/l10n)\n\nforeach(TS_FILE IN LISTS TS_FILES)\n    get_filename_component(TS_FILENAME ${TS_FILE} NAME)\n    string(REPLACE .ts .qm QM_FILENAME ${TS_FILENAME})\n    ail_generate_qm(${TS_FILENAME} ${target_dir}/${QM_FILENAME})\nendforeach()\n\n# deploy JSON files\nfile(GLOB JSON_FILES *.json)\n\nforeach(JSON_FILE IN LISTS JSON_FILES)\n    get_filename_component(JSON_FILENAME ${JSON_FILE} NAME)\n    add_custom_command(\n        TARGET l10n POST_BUILD\n        COMMAND ${CMAKE_COMMAND} -E copy ${JSON_FILENAME} ${target_dir}/${JSON_FILENAME}\n        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n    )\nendforeach()\n\n\n# empty directories aren't tracked by Git\n# therefore the directory needs to be created by CMake\nfile(MAKE_DIRECTORY ${target_dir})\n\ninstall(\n    DIRECTORY ${target_dir}\n    DESTINATION ${CMAKE_INSTALL_DATADIR}/appimagelauncher COMPONENT APPIMAGELAUNCHER\n)\n"
  },
  {
    "path": "i18n/auto-translate.py",
    "content": "#! /usr/bin/env python3\n\nimport sys\n\nfrom xml.etree import ElementTree as ET\n\n\ndef copy_sources_to_translations(root: ET.Element):\n    for context in root.findall(\"context\"):\n        for message in context.findall(\"message\"):\n            source = message.find(\"source\")\n            translation = message.find(\"translation\")\n\n            translation.text = source.text\n\n            if \"type\" in translation.attrib:\n                if translation.attrib[\"type\"] in (\"\", \"unfinished\"):\n                    del translation.attrib[\"type\"]\n\n\ndef main():\n    with open(sys.argv[1]) as f:\n        et = ET.parse(f)\n\n    root = et.getroot()\n\n    copy_sources_to_translations(root)\n\n    with open(sys.argv[1], \"wb\") as f:\n        f.write(ET.tostring(root))\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "i18n/desktopfiles.ast.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Desaniciar AppImage del sistema\",\n    \"Desktop Action update/Name\": \"Anovar AppImage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.cs.json",
    "content": "{\n    \"Desktop Action update/Name\": \"Aktualizovat AppImage\",\n    \"Desktop Action remove/Name\": \"Odebrat AppImage ze systému\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.de.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Dieses AppImage löschen\",\n    \"Desktop Action update/Name\": \"Dieses AppImage aktualisieren\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.en.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Delete this AppImage\",\n    \"Desktop Action update/Name\": \"Update this AppImage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.es.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Eliminar Appimage del Sistema\",\n    \"Desktop Action update/Name\": \"Actualizar Appimage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.fr.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Supprimer cette AppImage\",\n    \"Desktop Action update/Name\": \"Mettre à jour l'AppImage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.it.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Rimuovi questa AppImage\",\n    \"Desktop Action update/Name\": \"Aggiorna questa AppImage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.ko.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"이 AppImage 삭제\",\n    \"Desktop Action update/Name\": \"이 AppImage 업데이트\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.nb_NO.json",
    "content": "{\n    \"Desktop Action update/Name\": \"Oppdater AppImage\",\n    \"Desktop Action remove/Name\": \"Slett AppImage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.nl.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"AppImage deïnstalleren\",\n    \"Desktop Action update/Name\": \"AppImage bijwerken\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.pl.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Usuń AppImage z systemu\",\n    \"Desktop Action update/Name\": \"Uaktualnij AppImage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.pt.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Remover AppImage do sistema\",\n    \"Desktop Action update/Name\": \"Atualizar AppImage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.pt_BR.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Remover AppImage do sistema\",\n    \"Desktop Action update/Name\": \"Atualizar AppImage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.ru.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"Удалить AppImage\",\n    \"Desktop Action update/Name\": \"Обновить AppImage\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.tr.json",
    "content": "{\n    \"Desktop Action update/Name\": \"Bu AppImage uygulamasını güncelle\",\n    \"Desktop Action remove/Name\": \"Bu AppImage uygulamasını sil\"\n}\n"
  },
  {
    "path": "i18n/desktopfiles.zh_Hans.json",
    "content": "{\n    \"Desktop Action remove/Name\": \"删除此 AppImage\",\n    \"Desktop Action update/Name\": \"更新此 AppImage\"\n}\n"
  },
  {
    "path": "i18n/ui.ast.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"ast\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+755\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+51\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-7\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.cs.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"cs\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>První spuštění</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Vítejte v aplikaci AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Tento malý pomocník je navržen ke zlepšení vašich zkušeností s AppImage na vašem počítači.&lt;/p&gt;&lt;p&gt;Zdá se, že jste aplikaci AppImageLauncher nikdy předtím nespustili. Věnujte prosím chvíli nastavení vašich předvoleb. Tato nastavení můžete kdykoliv později změnit pomocí ovládacího panelu.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Ptát se, jestli přesunout nové AppImage soubory do určitého umístění</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Cílový adresář pro integraci:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Přizpůsobit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Vyberte cílový adresář pro integraci</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(výchozí)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Integrace pracovní plochy</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Integrovat a spustit</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Spustit jednou</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Varování</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>AppImage %1 již byl integrován, ale není v aktuálním cílovém adresáři pro integraci.\n\nChcete jej přesunout do nového cíle?\n\nVybráním Ne bude tento AppImage spuštěn jednou a ponechán ve svém aktuálním adresáři.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Selhalo zrušení registrace AppImage před opětovnou integrací</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Nelze zpracovat překlady desktop souboru:\nNelze otevřít soubor pro čtení:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Nelze zpracovat překlady desktop souboru:\nNeplatná syntaxe:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>Soubor %1 je vlastněn jiným uživatelem: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Problém oprávnění</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">File %1 is owned by another user: %2\n\nRelaunch with their permissions?</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>Selhalo spuštění pomocníka oprávnění, ukončen s návratovým kódem %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Nelze nalézt vhodný pomocník oprávnění, přerušuje se</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher momentálně nepodporuje AppImage soubory typu %1.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Nelze nastavit soubor AppImage jako spustitelný: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Failed to open AppImage for reading: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Failed to create temporary directory</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Failed to create temporary copy of type 1 AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Failed to open temporary AppImage copy for writing</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Failed to remove magic bytes from temporary AppImage copy</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() failed: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime not found: no such file or directory: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() selhalo: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Použití: %1 [volby] &lt;cesta&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Pomocník s integrací pracovní plochy pro soubory AppImage, pro použití v linuxových distribucích.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Volby:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Zobrazit tuto nápovědu a skončit</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Zobrazit verzi a skončit</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argumenty:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Cesta k AppImage (povinná)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Selhalo vyčištění starých desktop souborů</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Selhala registrace souboru AppImage v AppImageLauncherFS: chyba během pokusu o spuštění appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Selhala registrace souboru AppImage v AppImageLauncherFS: selhala registrace AppImage cesty %1</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Selhala registrace souboru AppImage v AppImageLauncherFS: nelze otevřít map soubor</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Selhala registrace souboru AppImage v AppImageLauncherFS: nelze nalézt virtuální soubor pro AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Selhala registrace souboru AppImage v AppImageLauncherFS: neznámá chyba</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Selhalo vyčištění koše souborů AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Neznámá volba AppImageLauncher: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Chyba: neexistující soubor nebo adresář: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Není soubor AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>Adresář pro uložení integrovaných souborů AppImage je aktuálně nastaven na:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">The directory the integrated AppImages are stored in is currently set to: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">Integrací bude soubor AppImage přesunut do předdefinovaného umístění a zahrnut ve vašem spouštěči aplikací.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Pro odebrání nebo aktualizaci AppImage prosím použijte kontextové menu ikony aplikace ve vašem panelu úloh nebo spouštěči.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">Adresář pro uložení integrovaných souborů AppImage je aktuálně nastaven na:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 nebylo integrováno do vašeho systému.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Integrace pracovní plochy</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Integrovat a spustit</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Spustit jednou</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Zrušit</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Removes AppImages after desktop integration, for use by Linux distributions</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher remove</translation>\n    </message>\n    <message>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</source>\n        <translation type=\"vanished\">Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>Pomocník pro jednoduché odebrání integrovaných souborů AppImage, např. z kontextového menu spouštěče aplikací</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Cesta k souboru AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;cesta&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>Chyba pomocníka odebrání AppImage</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage remove helper error</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>Není soubor AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Refusing to work on non-integrated AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Are you sure you want to remove this AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Selhalo zrušení registrace AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>Selhalo přesunutí souboru AppImage do adresáře koše</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Failed to remove AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>AppImage se stejným jménem souboru již byl integrován.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Přejete si přepsat existující soubor AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Vybráním Ne bude tento AppImage spuštěn jednou a systém bude ponechán ve svém aktuálním stavu.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Varování</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Failed to move AppImage to target location</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Selhala registrace AppImage v systému pomocí libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Nelze nalézt integrovaný desktop soubor</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>Nebyl nalezen desktop soubor integrovaného AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Nelze načíst desktop soubor:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>AppImage má neplatný desktop soubor</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Selhalo přesunutí souboru AppImage do cílového umístění.\nZkusit namísto toho soubor AppImage zkopírovat?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Selhalo volání stat() na cestě:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Failed to copy AppImage to target location</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Aktualizuje soubory AppImage po jejich integraci s pracovní plochou, pro použití v linuxových distribucích</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>AppImageLauncher aktualizace</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Do you wish to continue?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Nenalezeny žádné aktualizace</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Nebyly nalezeny aktualizace pro AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Failed to check for updates. Please check the command line output for details.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>Nebyly nalezeny žádné informace o aktualizaci</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Nelze nalézt informace o aktualizaci v souboru AppImage:\n%1\n\nTento AppImage nepodporuje aktualizace. Požádejte prosím jeho autory, aby nastavili upupdate informace pro umožnění jednoduchých aktualizací.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Selhala kontrola aktualizací:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>Byla nalezena aktualizace pro AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Chcete provést aktualizaci?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Odebrat starý soubor AppImage po úspěšné aktualizaci</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Selhala aktualizace AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>Soubor nahlášen jako aktualizovaný neexistuje: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Selhala registrace aktualizovaného AppImage v systému</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Selhalo zrušení registrace starého AppImage v systému</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Selhalo odebrání starého AppImage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>Sleduje soubory AppImage v adresářích aplikací (uživatelských, systémových a dalších). Automaticky integruje soubory AppImage přesunuté do těchto adresářů a ruší integrace těch, které jsou z nich odebrány.</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories in suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories in suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>Vypsat adresáře sledované tímto démonem a skončit</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>Odebrat AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Jste si jisti, že chcete odebrat tento AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">Remove AppImage file from system</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>AppImageLauncher nastavení</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher</source>\n        <translation type=\"vanished\">AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Dialog spouštěče</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Ptát se, jestli přesunout soubory AppImage do adresáře aplikací</translation>\n    </message>\n    <message>\n        <source>appimagelauncherd</source>\n        <translation type=\"vanished\">appimagelauncherd</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Obecná nastavení</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Když je toto políčko zaškrtnuto, AppImageLauncher automaticky spouští démona jménem appimagelauncherd.&lt;/p&gt;&lt;p&gt;Tento démon automaticky integruje soubory AppImage, které zkopírujete do &amp;quot;Adresáře aplikací&amp;quot; a dalších adresářů, které jste nastavili. Když jsou soubory odebrány, tento démon vyčistí data integrace.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Automaticky spustit auto-integrační démon</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>Další adresáře pro sledování</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>Přidat do seznamu nový adresář</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>Odebrat vybraný adresář ze seznamu</translation>\n    </message>\n    <message>\n        <source>-</source>\n        <translation type=\"vanished\">-</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Applications directory</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Cesta k adresáři aplikací</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Umístění, kam ukládat vaše soubory AppImage pro zjednodušení jejich správy</translation>\n    </message>\n    <message>\n        <source>Location where to store your AppImage files to ease their management using the file manager.</source>\n        <translation type=\"vanished\">Location where to store your AppImage files to ease their management using the file manager.</translation>\n    </message>\n    <message>\n        <source>/path</source>\n        <translation type=\"vanished\">/path</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Enable auto-integration daemon</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Dostupné vlastnosti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>aktualizátor dostupný pro soubory AppImage podporující AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>aktualizátor nedostupný</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Poznámka: toto je sestavení AppImageLauncher Lite, podporuje pouze limitovanou sadu funkcí&lt;/strong&gt;&lt;br /&gt;Nainstalujte prosím plnou verzi pomocí poskytnutých nativních balíčků pro plný zážitek z aplikace AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Vyberte adresář aplikací</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>Vyberte další adresář pro sledování</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.de.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"de\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Erste Ausführung</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Willkommen bei AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Dieses kleine Hilfsprogramm wurde entworfen, um Ihre AppImage-Erfahrung auf Ihrem Computer zu verbessern.&lt;/p&gt;&lt;p&gt;Es scheint, als hätten Sie AppImageLauncher nie zuvor ausgeführt. Bitte nehmen Sie sich eine Minute zeit und konfigurieren Sie Ihre Einstellungen. Sie können diese jederzeit über den Einstellungsdialog ändern.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Frage mich, ob neue AppImages in ein zentrales Verzeichnis verschoben werden sollen</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Integrations-Zielverzeichnis:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Anpassen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Wähle Integrations-Zielverzeichnis</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(Standard)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation>Desktop-Integration</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation>Symbol</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 wurde noch nicht in Ihr System integriert.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Durch die Integration wird das AppImage in ein vordefiniertes Verzeichnis verschoben, und in das Anwendungsmenü aufgenommen.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Um das AppImage zu aktualisieren oder zu entfernen, benutzen Sie bitte das Kontextmenü des Anwendungs-Icons in Ihrer Anwendungsleiste oder im Anwendungsmenü. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Das Verzeichnis, in dem die integrierten AppImages gespeichert werden, ist derzeit: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation>Integrieren und ausführen</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation>Einmalig ausführen</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Warnung</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage wurde bereits integriert, aber befindet sich nicht im aktuell gewählten Zielverzeichnis.\n\nMöchten Sie es in das neue Verzeichnis verschieben?\nSofern Sie Nein wählen, wird das AppImage einmal ausgeführt, und verbleibt in seinem derzeitigen Verzeichnis.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>Das AppImage %1 wurde bereits integriert, aber befindet sich nicht im derzeit konfigurierten Zielverzeichnis.\n\nMöchten Sie es in das neue Zielverzeichnis verschieben?\n\nSollten Sie Nein wählen, wird das AppImage einmalig ausgeführt, und es wird im aktuellen Verzeichnis belassen.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Fehler beim Deregistrieren des AppImages vor der Reintegration</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Konnte Übersetzungen für Desktop-Datei nicht parsen:\nKonnte Datei nicht zum Lesen öffnen:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Konnte Übersetzungen für Desktop-Datei nicht parsen:\nKaputte Syntax:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>Datei %1 gehört einem anderen Benutzer: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Rechte-Problem</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">Datei %1 gehört anderem Nutzer: %2\n\nNeu starten mit deren Rechten?</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>Fehler beim Ausführen des Rechte-Hilfsprogramms, beendet mit Rückgabewert %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Konnte kein geeignetes Rechte-Hilfsprogramm finden, breche ab</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher unterstützt zur Zeit keine AppImages vom Typ %1.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>AppImage konnte nicht ausführbar gemacht werden: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">AppImage konnte nicht lesend geöffnet werden: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Fehler beim Erstellen des temporären Verzeichnisses</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Temporäre Kopie des Typ-1-AppImages konnte nicht erstellt werden</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">AppImage konnte nicht schreibend geöffnet werden: %1</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Entfernen der magischen Bytes in der temporären AppImage-Kopie fehlgeschlagen</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() fehlgeschlagen: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime nicht gefunden: Datei oder Verzeichnis nicht vorhanden: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() fehlgeschlagen: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Benutzung: %1 [Optionen] &lt;Pfad&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Hilfsprogramm zur Desktop-Integration von AppImages, zur Verwendung durch Linux-Distributionen.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Optionen:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Hilfetext anzeigen und beenden</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Version anzeigen und beenden</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argumente:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Pfad zu AppImage (erforderlich)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation>Unerwartetes Ergebnis vom Integrations-Dialog.</translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Fehler beim Aufräumen der alten Desktop-Dateien</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Fehler beim Registrieren des AppImages in AppImageLauncherFS: Fehler beim Starten von appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Fehler beim Registrieren des AppImages in AppImageLauncherFS: Registrieren des AppImage-Pfades %1 fehlgeschlagen</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Fehler beim Registrieren des AppImages in AppImageLauncherFS: konnte Map-Datei nicht öffnen</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Fehler beim Registrieren des AppImages in AppImageLauncherFS: konnte virtuelle Datei für AppImage nicht finden</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Fehler beim Registrieren des AppImages in AppImageLauncherFS: unbekannter Fehler</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Fehler beim Aufräumen des AppImage-Papierkorbs: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Unbekannte AppImageLauncher-Option: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Fehler: Datei oder Verzeichnis nicht gefunden: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Datei ist kein AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>Das Verzeichnis zum Speichern der integrierten AppImages ist derzeit:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">Das derzeit konfigurierte Zielverzeichnis für integrierte AppImages ist: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">Durch die Integration wird das AppImage in ein vordefiniertes Verzeichnis verschoben, und in das Applikationsmenü aufgenommen.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Um das AppImage zu aktualisieren oder zu entfernen, benutzen Sie bitte das Kontextmenü des Anwendungs-Icons in Ihrer Task-Bar oder im Applikationsmenü.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">Das Verzeichnis, in welchem die integrierten AppImages gespeichert werden, ist derzeit:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 wurde noch nicht in Ihr System integriert.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Desktop-Integration</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Integrieren und ausführen</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Einmalig ausführen</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Abbruch</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Entfernt AppImages nach ihrer Desktop-Integration, zur Verwendung durch Linux-Distributionen</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher Löschhelfer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>Hilfsprogramm zum einfachen Löschen integrierter AppImages, z.B. durch das Kontextmenü des Programm-Menüs</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Pfad zu AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;Pfad&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>AppImage Lösch-Hilfsprogramm Fehler</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage Löschhelfer Fehler</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>Kein AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Verweigere Arbeit an nicht integriertem AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Bitte bestätigen</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Sind Sie sicher, dass Sie dieses AppImage entfernen möchten?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Fehler beim Deregistrieren des AppImages: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>Fehler beim Verschieben des AppImages in das Papierkorb-Verzeichnis</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Entfernen des AppImages fehlgeschlagen: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>AppImage mit gleichem Dateinamen wurde bereits integriert.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Möchten Sie das existierende AppImage überschreiben?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Bei Klick auf Nein wird das AppImage einmalig ausgeführt, und das System in seinem derzeitigen Zustand belassen.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Warnung</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Verschieben des AppImages in Zielverzeichnis fehlgeschlagen</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Fehler beim Registrieren des AppImages im System via libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Suche nach integrierter Desktop-Datei fehlgeschlagen</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>Konnte Desktop-Datei des integrierten AppImages nicht finden</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Fehler beim Laden der Desktop-Datei:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>AppImage hat ungültige Desktop-Datei</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Fehler beim Verschieben des AppImages in Zielverzeichnis.\nStattdessen versuchen, das AppImage zu kopieren?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Aufruf von stat() auf Pfad fehlgeschlagen:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Fehler beim Kopieren des AppImages in Zielverzeichnis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Aktualisiert AppImages nach Desktop-Integration, zur Verwendung durch Linux-Distributionen</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>AppImageLauncher Update</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">Das AppImage wurde bisher noch nicht integriert. Dieses Programm wird aber das aktualisierte AppImage integrieren.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Möchten Sie fortfahren?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Keine Aktualisierungen gefunden</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Konnte keine Updates finden für AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Fehler beim Update-Check. Bitte überprüfen Sie den Kommandozeilen-Log für weitere Details.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>Keine Update-Informationen gefunden</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Konnte keine Update-Informationen finden im AppImage:\n%1\n\nDas AppImage unterstützt keine Updates. Bitte fragen Sie die Autoren, die Update-Informationen zu setzen, um einfaches Aktualisieren zu ermöglichen.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Konnte keine Update-Informationen finden im AppImage:\n%1\n\nDas AppImage unterstützt keine Updates. Bitten Sie die Autoren, die Update-Informationen zu setzen, um einfaches Aktualisieren zu ermöglichen.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation>Konnte keine Update-Informationen finden im AppImage:\n%1\n\nDas AppImage unterstützt keine Aktualisierungen. Bitten Sie die Autoren, Update-Informationen einzubetten, um einfaches Aktualisieren zu ermöglichen.</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Fehler beim Update-Check:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>Eine Aktualisierung wurde gefunden für das AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Möchten Sie die Aktualisierung durchführen?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Entferne altes AppImage nach erfolgreicher Aktualisierung</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Fehler beim Aktualisieren des AppImages:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>Datei, die als aktualisiert angegeben wurde, existiert nicht: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Fehler beim Registrieren des aktualisierten AppImages im System</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Fehler beim Deregistrieren des alten AppImages im System</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Fehler beim Entfernen des alten AppImages</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>Überwacht AppImages in Applikations-Verzeichnissen (dem des Benutzers, des Systems und anderen). Integriert AppImages, die in diese Verzeichnisse verschoben werden, und entfernt die Integration derer, die von dort entfernt werden, automatisch.</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories in suitable mounted filesystems</source>\n        <translation type=\"vanished\">Suche nach AppImages in /Applications-Verzeichnis auf geeigneten, eingehängten Dateisystemen</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>Listet Verzeichnisse auf, welche von diesem Dienst überwacht werden, und beendet sich</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Bitte bestätigen</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Sind Sie sicher, dass Sie dieses AppImage entfernen wollen?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>AppImage löschen</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Sind Sie sicher, dass Sie dieses AppImage löschen möchten?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Abwählen, um nur die Desktop-Integration zu entfernen, die Datei aber auf dem System zu behalten.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">AppImage vom System entfernen</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>AppImageLauncher-Einstellungen</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Launcher-Dialog</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Frage, ob AppImages in Applications-Verzeichnis verschoben werden sollen</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Allgemeine Einstellungen</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Wird das Kästchen angehakt, wird AppImageLauncher automatisch einen Dienst namens appimagelauncherd starten.&lt;/p&gt;&lt;p&gt;Dieser Dienst integriert AppImages, die Sie in ihr &amp;quot; -Verzeichnis&amp;quot; und in die anderen überwachten Verzeichnisse kopieren, automatisch. Wenn die Dateien gelöscht werden, wird der Dienst die Integrations-Daten automatisch aufräumen.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Auto-Integrations-Dienst automatisch starten</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>Zusätzlich zu überwachende Verzeichnisse</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>Neues Verzeichnis zur Liste hinzufügen</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>Ausgewähltes Verzeichnis aus Liste entfernen</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Applications-Verzeichnis</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Wenn aktiviert, wird der Dienst automatisch AppImages, die in das &amp;quot;Applikationsverzeichnis&amp;quot; kopiert werden, integrieren. Wenn die Dateien gelöscht werden, wird der Dienst die Integrationsdaten automatisch aufräumen.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Pfad des Applikationsverzeichnisses</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Ort zur Speicherung der AppImage-Dateien, um sie leichter handhaben zu können</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Auto-Integrations-Dienst aktivieren</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Verfügbare Features</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>Updater verfügbar für AppImages, die AppImageUpdate unterstützen</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>Updater nicht verfügbar</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Anmerkung: dies ist ein AppImageLauncher-Lite-Build, welcher nur ein begrenztes Spektrum an Funktionen bietet&lt;/strong&gt;&lt;br /&gt;Bitte installieren Sie die Vollversion mittels der bereitgestellten nativen Pakete, um in den Genuss der vollständigen AppImageLauncher-Erfahrung kommen zu können</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Wähle Applications-Verzeichnis</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>Zusätzlich zu überwachendes Verzeichnis auswählen</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.en.ts",
    "content": "<TS version=\"2.1\" language=\"en_US\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\" />\n        <source>First run</source>\n        <translation>First run</translation>\n    </message>\n    <message>\n        <location line=\"+55\" />\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=\" font-size:11pt; font-weight:600;\"&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=\" font-size:11pt; font-weight:600;\"&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\" />\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Ask me whether to move new AppImages into a central location</translation>\n    </message>\n    <message>\n        <location line=\"+21\" />\n        <source>Integration target destination directory:</source>\n        <translation>Integration target destination directory:</translation>\n    </message>\n    <message>\n        <location line=\"+36\" />\n        <source>Customize</source>\n        <translation>Customize</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\" />\n        <source>Choose integration destination dir</source>\n        <translation>Choose integration destination dir</translation>\n    </message>\n    <message>\n        <location line=\"+17\" />\n        <source>(default)</source>\n        <translation>(default)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\" />\n        <source>Desktop Integration</source>\n        <translation>Desktop Integration</translation>\n    </message>\n    <message>\n        <location line=\"+20\" />\n        <source>Icon</source>\n        <translation>Icon</translation>\n    </message>\n    <message>\n        <location line=\"+21\" />\n        <source>&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\"&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=\"qrichtext\" content=\"1\" /&gt;&lt;style type=\"text/css\"&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=\" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;\"&gt;\n&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\"&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=\"qrichtext\" content=\"1\" /&gt;&lt;style type=\"text/css\"&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=\" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;\"&gt;\n&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+41\" />\n        <source>Integrate and run</source>\n        <translation>Integrate and run</translation>\n    </message>\n    <message>\n        <location line=\"+10\" />\n        <source>Run once</source>\n        <translation>Run once</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\" />\n        <source>Warning</source>\n        <translation>Warning</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</translation>\n    </message>\n    <message>\n        <location line=\"+1\" />\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\" />\n        <location line=\"+8\" />\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\" />\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Failed to unregister AppImage before re-integrating it</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\" />\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\" />\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\" />\n        <source>File %1 is owned by another user: %2</source>\n        <translation>File %1 is owned by another user: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\" />\n        <source>Permissions problem</source>\n        <translation>Permissions problem</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">File %1 is owned by another user: %2\n\nRelaunch with their permissions?</translation>\n    </message>\n    <message>\n        <location line=\"+52\" />\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>Failed to run permissions helper, exited with return code %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\" />\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Could not find suitable permissions helper, aborting</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\" />\n        <location line=\"+680\" />\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\" />\n        <location line=\"+12\" />\n        <location line=\"+12\" />\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\" />\n        <location line=\"+42\" />\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\" />\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher does not support type %1 AppImages at the moment.</translation>\n    </message>\n    <message>\n        <location line=\"+7\" />\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Could not make AppImage executable: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Failed to open AppImage for reading: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Failed to create temporary directory</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Failed to create temporary copy of type 1 AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Failed to open temporary AppImage copy for writing</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Failed to remove magic bytes from temporary AppImage copy</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() failed: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime not found: no such file or directory: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\" />\n        <source>execv() failed: %1</source>\n        <translation>execv() failed: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\" />\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Usage: %1 [options] &lt;path&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\" />\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Desktop integration helper for AppImages, for use by Linux distributions.</translation>\n    </message>\n    <message>\n        <location line=\"+3\" />\n        <source>Options:</source>\n        <translation>Options:</translation>\n    </message>\n    <message>\n        <location line=\"+1\" />\n        <source>Display this help and exit</source>\n        <translation>Display this help and exit</translation>\n    </message>\n    <message>\n        <location line=\"+1\" />\n        <source>Display version and exit</source>\n        <translation>Display version and exit</translation>\n    </message>\n    <message>\n        <location line=\"+2\" />\n        <source>Arguments:</source>\n        <translation>Arguments:</translation>\n    </message>\n    <message>\n        <location line=\"+1\" />\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Path to AppImage (mandatory)</translation>\n    </message>\n    <message>\n        <location line=\"+265\" />\n        <source>Unexpected result from the integration dialog.</source>\n        <translation>Unexpected result from the integration dialog.</translation>\n    </message>\n    <message>\n        <location line=\"-287\" />\n        <source>Failed to clean up old desktop files</source>\n        <translation>Failed to clean up old desktop files</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: could not open map file</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: unknown failure</translation>\n    </message>\n    <message>\n        <location line=\"+8\" />\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\" />\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Failed to clean up AppImage trash bin: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\" />\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Unknown AppImageLauncher option: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\" />\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\" />\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\" />\n        <source>Error: no such file or directory: %1</source>\n        <translation>Error: no such file or directory: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\" />\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\" />\n        <source>Not an AppImage: %1</source>\n        <translation>Not an AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\" />\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>The directory the integrated AppImages are stored in is currently set to:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">The directory the integrated AppImages are stored in is currently set to: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">The directory the integrated AppImages are stored in is currently set to:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 has not been integrated into your system.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Desktop Integration</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Integrate and run</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Run once</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Cancel</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Removes AppImages after desktop integration, for use by Linux distributions</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher remove</translation>\n    </message>\n    <message>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher's context menuz</source>\n        <translation type=\"vanished\">Helper to delete integrated AppImages easily, e.g., from the application launcher's context menuz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\" />\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher's context menu</source>\n        <translation>Helper to delete integrated AppImages easily, e.g., from the application launcher's context menu</translation>\n    </message>\n    <message>\n        <location line=\"+19\" />\n        <source>Path to AppImage</source>\n        <translation>Path to AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\" />\n        <source>&lt;path&gt;</source>\n        <translation>&lt;path&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\" />\n        <source>AppImage delete helper error</source>\n        <translation>AppImage delete helper error</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage remove helper error</translation>\n    </message>\n    <message>\n        <location line=\"+1\" />\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>Not an AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Refusing to work on non-integrated AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Are you sure you want to remove this AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\" />\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Failed to unregister AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\" />\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>Failed to move AppImage into trash bin directory</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Failed to remove AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\" />\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>AppImage with same filename has already been integrated.</translation>\n    </message>\n    <message>\n        <location line=\"+2\" />\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Do you wish to overwrite the existing AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+1\" />\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Choosing No will run the AppImage once, and leave the system in its current state.</translation>\n    </message>\n    <message>\n        <location line=\"-652\" />\n        <location line=\"+656\" />\n        <source>Warning</source>\n        <translation>Warning</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Failed to move AppImage to target location</translation>\n    </message>\n    <message>\n        <location line=\"-296\" />\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Failed to register AppImage in system via libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\" />\n        <source>Failed to find integrated desktop file</source>\n        <translation>Failed to find integrated desktop file</translation>\n    </message>\n    <message>\n        <location line=\"+6\" />\n        <source>Couldn't find integrated AppImage's desktop file</source>\n        <translation>Couldn't find integrated AppImage's desktop file</translation>\n    </message>\n    <message>\n        <location line=\"+20\" />\n        <source>Failed to load desktop file:</source>\n        <translation>Failed to load desktop file:</translation>\n    </message>\n    <message>\n        <location line=\"+12\" />\n        <source>AppImage has invalid desktop file</source>\n        <translation>AppImage has invalid desktop file</translation>\n    </message>\n    <message>\n        <location line=\"+271\" />\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Failed to move AppImage to target location.\nTry to copy AppImage instead?</translation>\n    </message>\n    <message>\n        <location line=\"+181\" />\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Failed to call stat() on path:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Failed to copy AppImage to target location</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\" />\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Updates AppImages after desktop integration, for use by Linux distributions</translation>\n    </message>\n    <message>\n        <location line=\"+3\" />\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>AppImageLauncher update</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn't been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">The AppImage hasn't been integrated before. This tool will, however, integrate the updated AppImage.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Do you wish to continue?</translation>\n    </message>\n    <message>\n        <location line=\"+67\" />\n        <source>No updates found</source>\n        <translation>No updates found</translation>\n    </message>\n    <message>\n        <location line=\"+1\" />\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Could not find updates for AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Failed to check for updates. Please check the command line output for details.</translation>\n    </message>\n    <message>\n        <location line=\"+7\" />\n        <source>No update information found</source>\n        <translation>No update information found</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn't support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Could not find update information in AppImage:\n%1\n\nThe AppImage doesn't support updating. Please ask the authors to set update information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn't support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Could not find update information in AppImage:\n%1\n\nThe AppImage doesn't support updating. Please ask the authors to set upupdate information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <location line=\"+1\" />\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn't support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn't support updating. Please ask the authors to embed update information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <location line=\"+12\" />\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Failed to check for updates:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\" />\n        <source>An update has been found for the AppImage %1</source>\n        <translation>An update has been found for the AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\" />\n        <source>Do you want to perform the update?</source>\n        <translation>Do you want to perform the update?</translation>\n    </message>\n    <message>\n        <location line=\"+4\" />\n        <source>Remove old AppImage after successful update</source>\n        <translation>Remove old AppImage after successful update</translation>\n    </message>\n    <message>\n        <location line=\"+24\" />\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Failed to update AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\" />\n        <source>File reported as updated does not exist: %1</source>\n        <translation>File reported as updated does not exist: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\" />\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Failed to register updated AppImage in system</translation>\n    </message>\n    <message>\n        <location line=\"+14\" />\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Failed to unregister old AppImage in system</translation>\n    </message>\n    <message>\n        <location line=\"+5\" />\n        <source>Failed to remove old AppImage</source>\n        <translation>Failed to remove old AppImage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\" />\n        <source>Tracks AppImages in applications directories (user's, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>Tracks AppImages in applications directories (user's, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories in suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories in suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <location line=\"+8\" />\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>Lists directories watched by this daemon and exit</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\" />\n        <source>Delete AppImage</source>\n        <translation>Delete AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\" />\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\" />\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">Remove AppImage file from system</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\" />\n        <source>AppImageLauncher Settings</source>\n        <translation>AppImageLauncher Settings</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher</source>\n        <translation type=\"vanished\">AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\" />\n        <source>Launcher Dialog</source>\n        <translation>Launcher Dialog</translation>\n    </message>\n    <message>\n        <location line=\"+6\" />\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Ask whether to move AppImage files into the applications directory</translation>\n    </message>\n    <message>\n        <source>appimagelauncherd</source>\n        <translation type=\"vanished\">appimagelauncherd</translation>\n    </message>\n    <message>\n        <location line=\"+119\" />\n        <source>General settings</source>\n        <translation>General settings</translation>\n    </message>\n    <message>\n        <location line=\"+6\" />\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\" />\n        <source>Auto start auto-integration daemon</source>\n        <translation>Auto start auto-integration daemon</translation>\n    </message>\n    <message>\n        <location line=\"+13\" />\n        <source>Additional directories to watch</source>\n        <translation>Additional directories to watch</translation>\n    </message>\n    <message>\n        <location line=\"+11\" />\n        <source>Add new directory to list</source>\n        <translation>Add new directory to list</translation>\n    </message>\n    <message>\n        <location line=\"+13\" />\n        <source>Remove selected directory from list</source>\n        <translation>Remove selected directory from list</translation>\n    </message>\n    <message>\n        <source>-</source>\n        <translation type=\"vanished\">-</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Applications directory</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\" />\n        <source>Applications directory path</source>\n        <translation>Applications directory path</translation>\n    </message>\n    <message>\n        <location line=\"-11\" />\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Location where to store your AppImage files to ease their management</translation>\n    </message>\n    <message>\n        <source>Location where to store your AppImage files to ease their management using the file manager.</source>\n        <translation type=\"vanished\">Location where to store your AppImage files to ease their management using the file manager.</translation>\n    </message>\n    <message>\n        <source>/path</source>\n        <translation type=\"vanished\">/path</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Enable auto-integration daemon</translation>\n    </message>\n    <message>\n        <location line=\"+49\" />\n        <source>Available Features</source>\n        <translation>Available Features</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\" />\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>updater available for AppImages supporting AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\" />\n        <source>updater unavailable</source>\n        <translation>updater unavailable</translation>\n    </message>\n    <message>\n        <location line=\"+5\" />\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</translation>\n    </message>\n    <message>\n        <location line=\"+137\" />\n        <source>Select Applications directory</source>\n        <translation>Select Applications directory</translation>\n    </message>\n    <message>\n        <location line=\"+17\" />\n        <source>Select additional directory to watch</source>\n        <translation>Select additional directory to watch</translation>\n    </message>\n</context>\n</TS>"
  },
  {
    "path": "i18n/ui.es.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"es\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Primera ejecución</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Le damos la bienvenida al AppImageLauncher.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Este auxiliar se ha diseñado para mejorar la experiencia con AppImage en su equipo.&lt;/p&gt;&lt;p&gt;Parece que no ha ejecutado AppImageLauncher antes. Tómese un momento para configurarlo. Siempre podrá modificar sus preferencias mediante el panel de control.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Preguntarme si deben moverse las AppImages nuevas a una ubicación central</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Directorio de destino para imágenes integradas:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Personalizar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Elija el directorio de destino de integración</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(predeterminado)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Integración de escritorio</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Integrar y ejecutar</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Ejecutar una vez</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Atención</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>La AppImage %1 ya se ha integrado pero no se encuentra en el directorio de destino de integración actual.\n\n¿Quiere trasladarlo al destino nuevo?\n\nSi elige «No» se ejecutará la AppImage una vez y se dejará en el directorio donde se encuentra ahora.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>No se pudo cancelar el registro de la AppImage antes de reintegrarla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>No se pudieron analizar las traducciones de archivos de escritorio:\nNo se pudo abrir el archivo para leerlo:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>No se pudieron analizar las traducciones de archivos de escritorio:\nLa sintaxis no es válida:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>El archivo «%1» es propiedad de otro usuario: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Problema de permisos</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>No se pudo ejecutar el auxiliar de permisos; se salió con el código %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>No se pudo encontrar un auxiliar de permisos adecuado; se interrumpe la operación</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">Este AppImage ya fue integrado pero no se encuentra ubicado en el &quot;directorio de aplicaciones&quot;. \n\nDesea mover el archivo a dicho directorio?\nSi elije &quot;No&quot; se ejecutara la aplicación de manera normal y el archivo permanecerá en su ubicación actual.</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>Por ahora, AppImageLauncher no admite AppImages de tipo %1.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>No se pudo hacer que la AppImage sea ejecutable: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Error al abrir AppImage para leer: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Error al crear el directorio temporal</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Error al crear una copia temporal del tipo 1 AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Error al abrir la copia temporal de AppImage para escribir</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Error al eliminar los bytes mágicos de la copia temporal de AppImage</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">Execv () falló: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">tiempo de ejecución no encontrado: no hay tal archivo o directorio: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() falló: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Uso: %1 [opciones] &lt;ruta&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Auxiliar de integración con el escritorio para AppImages destinado a distribuciones Linux.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Opciones:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Mostrar esta ayuda y salir</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Mostrar la versión y salir</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argumentos:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Ruta a la AppImage (obligatoria)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>No se pudieron quitar los archivos .desktop antiguos</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Error al registrar AppImage en AppImageLauncherFS: error al intentar iniciar appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Error al registrar AppImage en AppImageLauncherFS: no se pudo registrar la ruta de AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Error al registrar AppImage en AppImageLauncherFS: no se pudo abrir el archivo de mapa</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Error al registrar AppImage en AppImageLauncherFS: no se pudo encontrar el archivo virtual para AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Error al registrar AppImage en AppImageLauncherFS: error desconocido</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Fallo al limpiar la papelera de AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Opción de AppImageLauncher desconocida: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Error: no hay tal archivo o directorio: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>No es una AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>Las AppImages integradas en el sistema son guardadas en:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">El directorio en el que están almacenadas las AppImages integradas actualmente está configurado en: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">Integrarlo moverá el AppImage a una ubicación predefinida, y lo incluirá en su iniciador de aplicaciones.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Para eliminar o actualizar AppImage, utilice el menú contextual del icono de la aplicación en su barra de tareas o iniciador.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">El directorio en el que están almacenados los AppImages integrados está actualmente configurado para:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 no se ha integrado en su sistema.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Integración de escritorio</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Integrar y ejecutar</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Ejecutar una vez</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Cancelar</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Elimina AppImages después de la integración del escritorio, para ser utilizado por las distribuciones de Linux</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher eliminar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Ruta hacia AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;ruta&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>Error en el auxiliar de eliminación de AppImages</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage eliminar error de ayuda</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>No es una AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Negándose a trabajar en AppImage no integrado:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Por favor confirmar</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Seguro que desea eliminar esta AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Error al anular el registro de AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>No se pudo mover la AppImage a la papelera</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Error al eliminar AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>AppImage con el mismo nombre de archivo ha sido actualmente integrado.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Desea sobreescribir la AppImage existente?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Elegir No ejecutará AppImage una vez y dejará el sistema en su estado actual.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Advertencia</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Error al mover AppImage a la ubicación de destino</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Error al registrar AppImage en el sistema a través de libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Error al encontrar el archivo de escritorio integrado</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>No se pudo encontrar el archivo de escritorio de AppImage integrado</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Error al cargar el archivo de escritorio:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>AppImage tiene un archivo de escritorio no válido</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Error al mover AppImage a la ubicación de destino.\nIntenta copiar AppImage en su lugar?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Error al llamar a stat () en la ruta:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Error al copiar AppImage en la ubicación de destino</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Actualiza AppImages después de la integración del escritorio, para ser utilizado por las distribuciones de Linux</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>Actualización de AppImageLauncher</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">La AppImage no se ha integrado antes. Esta herramienta, sin embargo, integrará la AppImage actualizada.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Desea continuar?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>No se encontraron actualizaciones</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>No se pudieron encontrar las actualizaciones para AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>No se encontraron actualizaciones</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">No se encontró la información de actualización en la AppImage:\n%1\n\nEste AppImage no soporta actualizaciones. Por favor solicite al autor que incluya la información de actualizaciones.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">No se pudo encontrar la información de actualización en AppImage:\n%1\n\nAppImage no admite la actualización. Solicite a los autores que configuren información actualizada para permitir una fácil actualización.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Error al buscar actualizaciones:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>Se ha encontrado una actualización para AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Desea realizar la actualización?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Eliminar AppImage anterior después de una actualización exitosa</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Error al actualizar AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>El archivo informado como actualizado no existe: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Error al registrar AppImage actualizado en el sistema</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Error al anular el registro de AppImage anterior en el sistema</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Error al eliminar la antigua AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">No se pudo comprobar la existencia de actualizaciones. Para más detalles consulte los mensajes en la linea de comandos .</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Por favor confirmar</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Estás seguro de que quieres eliminar esta AppImage?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>Eliminar AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;¿Confirma que quiere eliminar esta AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Desmarque solo eliminar la integración de escritorio, pero deje el archivo en el sistema.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">Eliminar el archivo AppImage del sistema</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>Configuración de AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Diálogo de iniciador</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Preguntar si mover archivos de AppImage en el directorio de aplicaciones</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Configuración general</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Iniciar automáticamente demonio de integración autom.</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Directorio de aplicaciones</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Cuando está habilitado, el daemon integra automáticamente AppImages que copia en el&amp;quot;Directorio de aplicaciones&amp;quot;.Cuando los archivos se eliminan, el demonio limpiará los datos de integración.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Ruta del directorio de aplicaciones</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Ubicación donde almacenar sus archivos de AppImage para facilitar su gestión</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Habilitar demonio de autointegración</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Características disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>actualizador disponible para AppImages soportando AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>actualizador no disponible</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Nota: esta es una compilación de AppImageLauncher Lite, solo admite un conjunto limitado de características&lt;/strong&gt;&lt;br /&gt;Instale la versión completa a través de los paquetes nativos provistos para disfrutar de la experiencia completa de AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Seleccione el directorio de aplicaciones</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.fr.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"fr\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Premier lancement</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Bienvenue dans AppImageLauncher&#x202f; !&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Cet outil est conçu pour améliorer votre expérience avec les applications AppImage.&lt;/p&gt;&lt;p&gt;Il semblerait que vous n&apos;ayez jamais lancé AppImageLauncher auparavant. Prenez une minute pour configurer vos préférences. Vous pourrez toujours les changer plus tard en utilisant le panneau de configuration.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Demandez-moi si je veux déplacer le nouvel AppImage dans un répertoire centralisé</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Répertoire de destination des AppImages&#x202f;:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Personnalisez</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Choisissez le répertoire de destination des AppImages</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(par défaut)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Intégration bureau</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Intégrer et lancer</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Lancer une fois</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Avertissement</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">L&apos;AppImage a déjà été intégrée mais n&apos;est pas dans le répertoire d&apos;intégration actuel.\n\nVoulez-vous la déplacer vers le nouveau répertoire&#x202f;?\nSélectionner «&#x202f;Non&#x202f;» lancera l&apos;AppImage une fois et la laissera dans son répertoire actuel.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>L&apos;AppImage %1 a déjà été intégrée, mais elle n&apos;est pas dans le répertoire de destination des intégrations actuel.\n\nVoulez-vous la déplacer vers la nouvelle destination&#x202f;?\n\nSélectionner Non lancera l&apos;AppImage une fois et laissera l&apos;AppImage dans son répertoire actuel.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Impossible de désenregistrer l&apos;AppImage avant de la réintégrer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Impossible d&apos;analyser les traductions contenues dans le fichier «&#x202f;desktop&#x202f;»&#x202f;:\nImpossible d&apos;ouvrir le fichier pour lecture&#x202f;:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Impossible d&apos;analyser les traductions contenues dans le fichier «&#x202f;desktop&#x202f;»&#x202f;:\nSyntaxe invalide&#x202f;:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>Le fichier %1 appartient à un autre utilisateur : %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Problèmes de permissions</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>Echec de l&apos;exécution de l&apos;aide aux autorisations, quitté avec le code de retour %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>N&apos;a pas trouvé les aides de permissions appropriées, abandon</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher ne prend pas en charge actuellement les AppImages de type %1.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Impossible de rendre l&apos;AppImage exécutable&#x202f;: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Impossible de lire l&apos;AppImage&#x202f;: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Impossible de créer un répertoire temporaire</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Impossible de créer une copie temporaire d&apos;une AppImage de type 1</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Impossible d&apos;ouvrir une copie temporaire de l&apos;AppImage pour écriture</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Impossible de supprimer les octets magiques de la copie temporaire de l&apos;AppImage</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() a échoué&#x202f;: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime non trouvé&#x202f;: pas de tel fichier ou répertoire&#x202f;: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() a échoué&#x202f;: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Utilisation&#x202f;: %1 [options] &lt;chemin&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Assistant d&apos;intégration au bureau d&apos;AppImages, destiné à être utilisé par les distributions Linux.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Options&#x202f;:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Afficher cette aide et quitter</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Afficher la version et quitter</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Paramètres :</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Chemin vers l&apos;AppImage (requis)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Impossible de nettoyer les anciens fichiers «&#x202f;desktop&#x202f;»</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Echec de l&apos;enregistrement de l&apos;AppImage dans AppImageLauncherFS : erreur lors de l&apos;essai de lancement de appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Echec de l&apos;enregistrement de l&apos;AppImage dans AppImageLauncherFS : echec de l&apos;enregistrement dans le dossier AppImage 1%</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Impossible d&apos;enregistrer l&apos;AppImage dans AppImageLauncherFS : impossible d&apos;ouvrir le fichier de la carte</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Impossible d&apos;enregistrer &apos;AppImage dans AppImageLauncherFS : impossible de trouver un fichier virtuel pour AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Impossible d&apos;enregistrer l&apos;AppImage dans AppImageLauncherFS : impossible de trouver un fichier virtuel pour AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Impossible de nettoyer la corbeille à AppImages&#x202f;: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Option non reconnue par AppImageLauncher&#x202f;: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Erreur&#x202f;: pas de tel fichier ou répertoire&#x202f;: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Pas une AppImage&#x202f;: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>Le répertoire où sont stockées les AppImages intégrées est actuellement défini à&#x202f;:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">Le répertoire de destination des intégrations d&apos;AppImage est actuellement défini à&#x202f;: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">L&apos;intégrer va déplacer l&apos;AppImage dans un endroit prédéterminé et l&apos;inclure dans votre lanceur d&apos;application.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Pour supprimer ou mettre à jour l&apos;AppImage, utilisez le menu contextuel de l&apos;icône d&apos;application dans votre barre de tâches ou lanceur d&apos;application.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">Le répertoire où les AppImages intégrées sont stockées est actuellement&#x202f;:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 n&apos;a pas été intégré à votre système.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Intégration bureau</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Intégrer et lancer</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Lancer une fois</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Annuler</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Supprime les AppImages après l&apos;intégration au bureau, destiné à être utilisé par les distributions Linux</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">Suppression par AppImageLauncher</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>Aide pour supprimer facilement les AppImages intégrées, par exemple dans le menu contextuel du lanceur d&apos;application</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Chemin vers l&apos;AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;chemin&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>Erreur de l&apos;aide à la suppression de l&apos;AppImage</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">Erreur de l&apos;assistant de suppression d&apos;AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>N&apos;est pas une AppImage\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Veuillez confirmer</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Voulez-vous vraiment supprimer cette AppImage&#x202f;?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Impossible de désenregistrer l&apos;AppImage&#x202f;: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>Impossible de déplacer l&apos;AppImage vers le répertoire de corbeille</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Impossible de supprimer l&apos;AppImage&#x202f;: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>Une AppImage avec le même nom de fichier a déjà été intégrée.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Voulez-vous supprimer l&apos;AppImage déjà existante&#x202f;?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Sélectionner Non lancera l&apos;AppImage une fois et laissera votre système dans son état actuel.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Avertissement</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Impossible de déplacer l&apos;AppImage vers son répertoire cible</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Impossible d&apos;enregistrer l&apos;AppImage dans le système via libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Impossible de trouver le fichier «&#x202f;desktop&#x202f;» intégré</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>Impossible de trouver le fichier «&#x202f;desktop&#x202f;» de l&apos;AppImage intégrée</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Impossible de charger le fichier «desktop»&#x202f;:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>L&apos;AppImage a un fichier «&#x202f;desktop&#x202f;» invalide</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Impossible de déplacer l&apos;AppImage vers le répertoire cible.\nEssayer plutôt de la copier&#x202f;?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Impossible d&apos;appeler stat() sur le chemin :\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Impossible de copier l&apos;AppImage vers le répertoire cible</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Met à jour les AppImages après l&apos;intégration au bureau, destiné à être utilisé par les distributions Linux</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>Mise à jour par AppImageLauncher</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">L&apos;AppImage n&apos;a pas été intégrée auparavant. Cependant, cet outil intégrera l&apos;AppImage mise à jour.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Voulez-vous continuer&#x202f;?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Pas de mises à jour trouvées</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Impossible de trouver des mises à jour pour l&apos;AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Impossible de vérifier les mises à jour. Vérifiez la sortie en ligne de commandes pour plus d&apos;informations.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>Aucune information de mise à jour trouvée</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Impossible de trouver des informations de mise à jour dans l&apos;AppImage&#x202f;:\n%1\n\nCette AppImage ne prend pas en charge les mises à jour. Veuillez contacter les auteurs pour qu&apos;ils définissent des informations de mise à jour, ce qui permet les mises à jour automatiques.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Impossible de trouver des informations de mises à jours dans AppImage :\n%1\n\nL&apos;AppImage ne prend pas en charge la mise à jour. Veuillez demander aux auteurs de configurer les informations de mise à jour pour permettre une mise à jour facile.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Impossible de vérifier la disponibilité de mises à jour&#x202f;:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>Une mise à jour a été trouvée pour l&apos;AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Voulez-vous effectuer la mise à jour&#x202f;?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Supprimer l&apos;ancienne AppImage après une mise à jour réussie</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>La mise à jour de l&apos;AppImage a échoué&#x202f;:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>Le fichier signalé comme mis à jour n&apos;existe pas&#x202f;: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Impossible d&apos;enregistrer l&apos;AppImage mise à jour dans le système</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Impossible de désenregistrer l&apos;ancienne AppImage du système</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Impossible de supprimer l&apos;ancienne AppImage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>Suit les AppImages dans les répertoires d&apos;applications (utilisateur, système et autres). Intègre automatiquement les AppImages déplacées dans ces répertoires et désintégre celles qui en ont été retirées.</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>Liste les répertoires surveillés par ce démon et quitter</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"obsolete\">Veuillez confirmer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>Supprimer l&apos;AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Etes vous sur de vouloir supprimer cette AppImage ?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>Paramètres de AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Dialogue avec le lanceur</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Demandez s&apos;il faut déplacer les fichiers AppImage dans le répertoire des applications</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Paramètres généraux</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Lorsque cette case est cochée, AppImageLauncher lance automatiquement un démon appelé appimagelauncherd.&lt;/p&gt;&lt;p&gt;Ce démon intègre automatiquement les AppImages que vous copiez dans le répertoire &amp;quot;Applications et les répertoires supplémentaires que vous avez configurés. Lorsque les fichiers sont supprimés, le démon nettoie les données d&apos;intégration.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Démarrage automatique du démon d&apos;auto-intégration</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>Autres répertoires à consulter</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>Ajouter un nouveau répertoire à la liste</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>Supprimer le répertoire sélectionné de la liste</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Chemin d&apos;accès au répertoire des applications</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Emplacement où stocker vos fichiers AppImage pour faciliter leur gestion</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Fonctionnalités disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>Mise à jour disponible pour les AppImages supportant AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>mise à jour non disponible</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Note : il s&apos;agit d&apos;une version AppImageLauncher Lite, qui ne supporte qu&apos;un ensemble limité de fonctionnalités&lt;/strong&gt;&lt;br /&gt;Veuillez installer la version complète via les paquets natifs fournis pour profiter pleinement de l&apos;expérience d&apos;AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Selectionner le répertoire d&apos;applications</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>Sélectionner un répertoire supplémentaire à voir</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.it.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"it\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Primo avvio</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Benvenuto su AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Questo piccolo assistente è progettato per migliorare la tua esperienza con le AppImage sul tuo computer.&lt;/p&gt;&lt;p&gt;Sembra che tu non abbia mai eseguito AppImageLauncher prima. Ti preghiamo di dedicare un minuto e configurare le tue preferenze. Puoi sempre modificarle in seguito, utilizzando il pannello di controllo.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Chiedimi se spostare le nuove AppImage in una posizione centrale</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Directory di destinazione per l&apos;integrazione:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Personalizza</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Scegliere la directory di destinazione per l&apos;integrazione</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(predefinito)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Integrazione Desktop</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Integra e avvia</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Avvia una volta</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Avviso</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage è già stato integrato, ma non si trova nella directory di destinazione dell&apos;integrazione corrente.\n\nVuoi spostarlo nella nuova destinazione?\nScegliendo No verrà eseguito l&apos;AppImage una volta e lascerà l&apos;AppImage nella sua directory corrente.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>L&apos;AppImage %1 è già stata integrata, ma non si trova nella directory di integrazione corrente.\n\nVuoi spostarla nella nuova destinazione?\n\nScegliendo No verrà eseguita l&apos;AppImage una volta e verrà lasciata l&apos;AppImage nella sua directory corrente.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Errore</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Impossibile annullare la registrazione dell&apos;AppImage per reintegrarla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Impossibile analizzare le traduzioni dei file desktop:\nImpossibile aprire il file per la lettura:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Impossibile analizzare le traduzioni dei file desktop:\nSintassi non valida:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>Il file %1 è di proprietà di un altro utente: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Problema con i permessi</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">Il file %1 è di proprietà di un altro utente: %2\n\nRilanciare con i loro permessi?</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>Impossibile eseguire l&apos;assistente dei permessi, terminato con il codice di ritorno %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Impossibile trovare un assistente dei permessi adeguato, interrotto</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Errore</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher non supporta AppImage di tipo %1 al momento.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Impossibile rendere eseguibile l&apos;AppImage: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Impossibile aprire AppImage per la lettura: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Impossibile creare la directory temporanea</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Impossibile creare una copia temporanea di AppImage di tipo 1</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Impossibile aprire la copia temporanea di AppImage per la scrittura</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Impossibile rimuovere i byte magici dalla copia temporanea di AppImage</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() fallito: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime non trovato: nessun file o directory:% 1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() fallito: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Uso: %1 [opzioni] &lt;percorso&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Assistente di integrazione desktop per AppImage, per l&apos;utilizzo da parte di distribuzioni Linux.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Opzioni:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Visualizza questa guida ed esce</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Visualizza la versione ed esce</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argomenti:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Percorso dell&apos;AppImage (obbligatorio)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Impossibile ripulire i vecchi file desktop</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Impossibile registrare AppImage in AppImageLauncherFS: errore durante il tentativo di avviare appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Impossibile registrare AppImage in AppImageLauncherFS: impossibile registrare il percorso AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Impossibile registrare AppImage in AppImageLauncherFS: impossibile aprire la mappa del file</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Impossibile registrare AppImage in AppImageLauncherFS: impossibile trovare il file virtuale per AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Impossibile registrare AppImage in AppImageLauncherFS: errore sconosciuto</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Impossibile ripulire il cestino delle AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Opzione AppImageLauncher sconosciuta: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Errore: file o directory non esistente: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Non un&apos;AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>La directory in cui sono archiviate le AppImage integrate è attualmente impostata su:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">La directory in cui sono archiviati gli AppImages integrati è attualmente impostata: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">Integrandola, l&apos;AppImage verrà spostata in una posizione predefinita e verrà inclusa nel launcher delle applicazioni.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Per rimuovere o aggiornare un&apos;AppImage, utilizzare il menu di scelta rapida sull&apos;icona dell&apos;applicazione nella barra delle applicazioni o nel launcher delle applicazioni.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">La directory in cui sono archiviate le AppImage integrate è attualmente impostata su:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 non è stata integrata nel tuo sistema.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Integrazione Desktop</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Integra e avvia</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Avvia una volta</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Annulla</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Rimuove AppImages dopo l&apos;integrazione desktop, per l&apos;utilizzo da parte delle distribuzioni Linux</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">Rimuovi AppImageLauncher</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>Aiuta ad eliminare facilmente le AppImage integrate, ad es. dal menu contestuale del launcher delle applicazioni</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Percorso dell&apos;AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;percorso&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>Errore assistente di rimozione AppImage</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage rimuove l&apos;errore dell&apos;helper</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>Non è un&apos;AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Rifiuto di lavorare su un AppImage non integrato:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Si prega di confermare</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Sei sicuro di voler rimuovere questa AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Impossibile annullare la registrazione dell&apos;AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>Impossibile spostare AppImage nel cestino</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Impossibile rimuovere AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>Un&apos;AppImage con lo stesso nome è già stata integrata.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Desideri sovrascrivere l&apos;AppImage esistente?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Scegliendo No, l&apos;AppImage verrà eseguita una volta e il sistema sarà lasciato nel suo stato corrente.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Avviso</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Impossibile spostare AppImage nella posizione di destinazione</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Impossibile registrare AppImage nel sistema tramite libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Impossibile trovare il file desktop integrato</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>Impossibile trovare il file desktop dell&apos;AppImage integrata</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Caricamento del file desktop non riuscito:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>L&apos;AppImage ha un file desktop non valido</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Impossibile spostare l&apos;AppImage nella posizione di destinazione.\nProvare invece a copiare l&apos;AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Impossibile invocare stat() sul percorso:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Impossibile copiare AppImage nella posizione di destinazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Aggiorna le AppImage dopo l&apos;integrazione desktop, per l&apos;utilizzo da parte delle distribuzioni Linux</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>Aggiornare AppImageLauncher</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">AppImage non è stato integrato prima. Questo strumento, tuttavia, integrerà l&apos;AppImage aggiornato.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Vuoi continuare?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Nessun aggiornamento trovato</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Impossibile trovare aggiornamenti per l&apos;AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Impossibile controllare gli aggiornamenti. Controllare l&apos;output della riga di comando per i dettagli.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>Nessuna informazione di aggiornamento trovata</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Impossibile trovare le informazioni di aggiornamento in AppImage:\n%1\n\nAppImage non supporta l&apos;aggiornamento. Si prega di chiedere agli autori di impostare le informazioni di aggiornamento per consentire un facile aggiornamento.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Impossibile trovare le informazioni di aggiornamento in AppImage:\n%1\n\nAppImage non supporta l&apos;aggiornamento. Si prega di chiedere agli autori di impostare informazioni aggiornate per consentire un facile aggiornamento.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation>Impossibile trovare le informazioni di aggiornamento nell&apos;AppImage:\n%1\n\nL&apos;AppImage non supporta gli aggiornamenti. Per favore chiedi agli autori di includere le informazioni di aggiornamento per facilitare gli aggiornamenti.</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Impossibile controllare gli aggiornamenti:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>È stato trovato un aggiornamento per l&apos;AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Vuoi eseguire l&apos;aggiornamento?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Rimuovere la vecchia AppImage dopo un aggiornamento riuscito</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Impossibile aggiornare l&apos;AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>Il file segnalato come aggiornato non esiste: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Impossibile registrare l&apos;AppImage aggiornata nel sistema</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Impossibile annullare la registrazione della vecchia AppImage dal sistema</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Impossibile rimuovere la vecchia AppImage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>Tiene traccia delle AppImage nelle directory delle applicazioni (dell&apos;utente, di sistema e altre). Integra le AppImage spostate in queste directory e deintegra quelle rimosse automaticamente.</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>Elenca le directory monitorate da questo demone ed esce</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Si prega di confermare</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Sei sicuro di voler rimuovere questa AppImage?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>Elimina AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Sei sicuro di voler eliminare questa AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Deseleziona per rimuovere solo l&apos;integrazione desktop, ma lascia il file sul sistema.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">Rimuovere il file AppImage dal sistema</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>Impostazioni AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Finestra di dialogo del launcher</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Chiedere se spostare i file AppImage nella directory delle applicazioni</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Impostazioni generali</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Quando questa checkbox è spuntata, AppImageLauncher avvia automaticamente un demone chiamato appimagelauncherd.&lt;/p&gt;&lt;p&gt;Questo demone integra automaticamente le AppImage che vengono copiate nella &quot;directory delle applicazioni&quot; e nelle directory aggiuntive configurate. Quando i file vengono eliminati, il demone pulisce automaticamente i dati d&apos;integrazione.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Avviare il demone di auto-integrazione automaticamente</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>Directory aggiuntive da monitorare</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>Aggiungi nuova directory all&apos;elenco</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>Rimuovi directory selezionata dall&apos;elenco</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Directory delle applicazioni</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Se abilitato, il demone integra automaticamente le AppImages copiate dentro nel &amp;quot;Directory delle applicazioni&amp;quot;. Quando i file vengono eliminati, il demone pulirà i dati di integrazione.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Percorso della directory delle applicazioni</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Posizione in cui archiviare i file AppImage per facilitarne la gestione</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Abilita il demone di integrazione automatica</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Funzionalità disponibili</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>aggiornamenti disponibili per le AppImage che supportano AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>aggiornamenti non disponibili</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Nota: questa è una build di AppImageLauncher Lite, supporta solo un set limitato di funzionalità&lt;/strong&gt;&lt;br /&gt;Installa la versione completa tramite i pacchetti nativi forniti per usufruire dell&apos;esperienza AppImageLauncher completa</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Seleziona la directory Applicazioni</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>Seleziona directory aggiuntive da monitorare</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.nb_NO.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"nb_NO\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Førstegangs bruk</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Velkommen til AppImageLauncher.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Denne lille hjelperen er designet for å forbedre din AppImage-opplevelse på din datamaskin.&lt;/p&gt;&lt;p&gt;Det ser ut til at du aldri har kjørt AppImageLauncher før. Bruk litt tid på å sette opp innstillingene dine. Du kan alltid endre disse senere, ved bruk av kontrollpanelet.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Spør hvorvidt flytting til sentral plassering skal utføres for ethvert nytt AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation type=\"unfinished\">Integrasjonsmål for målmappe:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Tilpass</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation type=\"unfinished\">Velg integrasjonsmålmappe</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(forvalg)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Skrivebordsintegrasjon</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Integrer og kjør</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Kjør én gang</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Advarsel</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation type=\"unfinished\">AppImage %1 har allerede blitt integrert, men det er ikke å finne i nåværende integrasjonsmålmapppe.\n\nØnsker du å flytte det til den nye mappen?\n\nÅ velge &quot;Nei&quot; vil kjøre AppImage én gang, og levne det i sin nåværende mappe.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Feil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Klarte ikke å avregistrere AppImage før re-integrering av det</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Kunne ikke tolke skrivebordsfiloversettelser:\nKunne ikke åpne fil for lesing:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation type=\"unfinished\">Kunne ikke tolke skrivebordsfiloversettelser:\nUgyldig syntaks:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>Filen %1 eies av en annen bruker: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Tilgangsproblem</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">File %1 is owned by another user: %2\n\nRelaunch with their permissions?</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation type=\"unfinished\">Klarte ikke å kjøre tilgangshjelper, avsluttet med returkode %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Fant ikke passende tilgangshjelper, avbryter</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Feil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher støtter ikke AppImage av %1-type for øyeblikket.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Kunne ikke gjøre AppImage kjørbar: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Failed to open AppImage for reading: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Failed to create temporary directory</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Failed to create temporary copy of type 1 AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Failed to open temporary AppImage copy for writing</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Failed to remove magic bytes from temporary AppImage copy</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() failed: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime not found: no such file or directory: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation type=\"unfinished\">execv() mislyktes: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Bruk: %1 [tilvalg] &lt;sti&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation type=\"unfinished\">Skrivebordsintegrasjonshjelper for AppImage-filer for bruk i Linux-distribusjoner.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Tilvalg:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Vis denne hjelpen og avslutt</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Vis versjon og avslutt</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argumenter:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation type=\"unfinished\">Sti til AppImage (påkrevd)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation type=\"unfinished\">Klarte ikke å tømme gamle skrivebordsfiler</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: could not open map file</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: unknown failure</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation type=\"unfinished\">Klarte ikke å tømme papirkurv tilhørende AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Ukjent AppImageLauncher-valg: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Feil: Ingen slik fil eller mappe: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Ikke et AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>Mappen integrerte AppImage-filer lagres i er satt til:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">The directory the integrated AppImages are stored in is currently set to: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"obsolete\">Integrasjon vil flytte AppImage til predefinert plassering, og inkludere det i din programstarter.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"obsolete\">For å flytte eller oppdatere AppImage, bruk bindeleddsmenyen til programikonet i ditt oppgavelinje eller programstarter.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">Mappen integrerte AppImage-filer lagres i er satt til:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 har ikke blitt integrert i systemet ditt.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Skrivebordsintegrasjon</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Integrer og kjør</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Kjør én gang</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Avbryt</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Removes AppImages after desktop integration, for use by Linux distributions</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher remove</translation>\n    </message>\n    <message>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</source>\n        <translation type=\"vanished\">Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>Hjelper for å slette integrerte AppImage-filer enkelt, fra programoppstarterens bindeleddsmeny</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Sti til AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;sti&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation type=\"unfinished\">Slettingsfeil for AppImage-hjelperen</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage remove helper error</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>Ikke et AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Refusing to work on non-integrated AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Are you sure you want to remove this AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation type=\"unfinished\">Klarte ikke å avregistrere AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation type=\"unfinished\">Klarte ikke å flytte AppImage til papirkurvsmappe</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Failed to remove AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation type=\"unfinished\">AppImage med samme filnavn allerede integrert.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Ønsker du å overskrive eksisterende AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation type=\"unfinished\">Å velge &quot;Nei&quot; vil kjøre AppImage én gang, og levne systemet i nåværende tilstand.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Advarsel</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Failed to move AppImage to target location</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation type=\"unfinished\">Klarte ikke å registrere AppImage i system via libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation type=\"unfinished\">Klarte ikke å finne integrert skrivebordsfil</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation type=\"unfinished\">Kunne ikke finne den integrerte skrivebordsfilen tilhørende AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation type=\"unfinished\">Klarte ikke å laste inn skrivebordsfil:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation type=\"unfinished\">AppImage har ugyldig skrivebordsfil</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation type=\"unfinished\">Klarte ikke å flytte AppImage til målmappe.\nPrøve å kopiere AppImage istedenfor?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation type=\"unfinished\">Klarte ikke å kalle stat() i sti:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Failed to copy AppImage to target location</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Oppdaterer AppImage-filer etter skrivebordsintegrasjon, for bruk i Linux-distribusjoner</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>AppImageLauncher-oppdatering</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Do you wish to continue?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Fant ingen oppdateringer</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation type=\"unfinished\">Fant ingen oppdateringer for %1-AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Failed to check for updates. Please check the command line output for details.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation type=\"unfinished\">Fant ingen oppdateringsinfo</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Kunne ikke finne oppdateringsinfo i AppImage:\n%1\n\nAppImage støtter ikke oppdatering. Sprøv utviklerne om å sette upupdate-info for enkel oppdatering.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation type=\"unfinished\">Klarte ikke å sjekke oppdateringer:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation type=\"unfinished\">Oppdatering tilgjengelig for AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation type=\"unfinished\">Ønsker du å utføre oppdateringen?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation type=\"unfinished\">Fjern gammelt AppImage etter oppdatering</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation type=\"unfinished\">Klarte ikke å oppdatere AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation type=\"unfinished\">Fil rapporter som oppdatert finnes ikke: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation type=\"unfinished\">Klarte ikke å registrere oppdatert AppImage i system</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Klarte ikke å avregistrere gammelt AppImage i system</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Klarte ikke å fjerne gammelt AppImage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation type=\"unfinished\">Sporer AppImage-filer i programmapper (brukerens, systemet og andre). Integrerer AppImage-filer flyttet til disse mappene automatisk, og avintegrerer de som flyttes fra dem.</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories in suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories in suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation type=\"unfinished\">List opp mapper denne nissen holder oppsyn med og avslutt</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>Slett AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Er du sikker på at du vil slette valgt AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">Remove AppImage file from system</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>AppImageLauncher-innstillinger</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher</source>\n        <translation type=\"vanished\">AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Oppstarter-dialog</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation type=\"unfinished\">Spør hvorvidt AppImage-filer skal flyttes til programmappen</translation>\n    </message>\n    <message>\n        <source>appimagelauncherd</source>\n        <translation type=\"vanished\">appimagelauncherd</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Generelle innstillinger</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;AppImageLauncher starter en nisse ved navn appimagelauncherd automatisk.&lt;/p&gt;&lt;p&gt;Denne nissen integrerer AppImage-filer du kopierer inn i &amp;quot;Programmappen&amp;quot; og ytterligere mapper du har satt opp. Når filer slettes, vil nissen renske opp i integrasjonsdataen.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Start auto-integrasjonsnissen automatisk</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>Ytterligere mapper å holde oppsyn med</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>Legg til ny mappe i listen</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>Fjern valgt mappe fra listen</translation>\n    </message>\n    <message>\n        <source>-</source>\n        <translation type=\"vanished\">-</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Applications directory</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Programmappesti</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Plassering du ønsker å lagre dine AppImage-filer for å forenkle håndteringen</translation>\n    </message>\n    <message>\n        <source>Location where to store your AppImage files to ease their management using the file manager.</source>\n        <translation type=\"vanished\">Location where to store your AppImage files to ease their management using the file manager.</translation>\n    </message>\n    <message>\n        <source>/path</source>\n        <translation type=\"vanished\">/path</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Enable auto-integration daemon</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Tilgjengelige funksjoner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation type=\"unfinished\">oppdaterer tilgjengelig for AppImage-filer som støtter AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>oppdaterer utilgjengelig</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation type=\"unfinished\">&lt;strong&gt;Merk: Dette er et AppImageLauncher Lite-bygg, det støtter kun et begrenset sett funksjoner&lt;/strong&gt;&lt;br /&gt;Installer fullversjonen via tilbudte inngebygde pakker for den beste AppImageLauncher-opplevelsen</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Velg programmappe</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>Velg ytterligere mappe å holde oppsyn med</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.nl.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"nl\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Eerste opstart</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welkom bij AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Dit hulpprogramma is ontworpen om je AppImage-ervaring te verbeteren.&lt;/p&gt;&lt;p&gt;Het lijkt er op dat dit de eerste opstart is. Neem een minuutje de tijd om je voorkeuren op te geven. Je kunt alles achteraf nog aanpassen middels het configuratiescherm.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Vragen of AppImages moeten worden verplaatst naar een centrale locatie</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Integratie-doelmap:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Aanpassen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Kies de integratie-doelmap</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(standaard)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Werkomgevingsintegratie</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Integreren en starten</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Eén keer starten</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Waarschuwing</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage is al geïntegreerd, maar staat nog niet in de integratiemap.\n\nWil je het daarheen verplaatsen?\nKies &apos;Nee&apos; om de AppImage eenmalig op te starten en in de huidige map te laten.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>AppImage is al geïntegreerd, maar staat nog niet in de integratiemap.\n\nWil je het daarheen verplaatsen?\n\nKies &apos;Nee&apos; om de AppImage eenmalig op te starten en in de huidige map te laten.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Foutmelding</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Kan AppImage niet weghalen alvorens opnieuw te integreren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Kan de vertalingen niet verwerken:\nKan het volgende bestand niet uitlezen:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Kan de vertalingen niet verwerken:\nOngeldige syntax:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>Het bestand, %1, is eigendom van een andere gebruiker: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Machtigingsprobleem</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">Het bestand, %1, is eigendom van een andere gebruiker: %2\n\nWil je het openen met zijn/haar machtigingen?</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>Kan de machtigingshelper niet starten: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Kan geen geschikte machtigingshelper starten</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Foutmelding</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher heeft momenteel geen ondersteuning voor %1.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Kan AppImage niet uitvoerbaar maken: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Kan AppImage niet uitlezen: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Kan geen tijdelijke werkmap maken</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Kan geen tijdelijke kopie maken van AppImage type 1</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Kan geen tijdelijke AppImage-kopie wegschrijven</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Kan de magische bytes niet weghalen uit de tijdelijke AppImage-kopie</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() mislukt: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime niet aangetroffen: bestand of map bestaat niet: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() mislukt: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Gebruik: %1 [opties] &lt;pad&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Werkomgevingshelper voor AppImages, voor gebruik door Linux-distributies.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Opties:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Toon dit hulpbericht en sluit af</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Toon de versie en sluit af</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argumenten:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Pad naar AppImage (vereist)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Kan de oude .desktop-bestanden niet opruimen</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Kan AppImage niet vastleggen in AppImageLauncherFS: fout tijdens starten van appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Fout tijdens vastleggen van AppImage in AppImageLauncherFS: kan AppImage-pad %1 niet vastleggen</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Kan AppImage niet vastleggen in AppImageLauncherFS: kan kaartbestand niet openen</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Kan AppImage niet vastleggen in AppImageLauncherFS: kan virtueel bestand van AppImage niet vinden</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Kan AppImage niet vastleggen in AppImageLauncherFS: onbekende fout</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Kan de AppImage-prullenbak niet legen: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Onbekende AppImageLauncher-optie: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Fout: bestand of map bestaat niet: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Geen AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>De map met de opgeslagen geïntegreerde AppImages is momenteel ingesteld op:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">De map met de opgeslagen geïntegreerde AppImages is momenteel ingesteld op: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">Door AppImages te integreren worden ze verplaatst naar een opgegeven locatie en wordt er een snelkoppeling gemaakt in je programmastarter.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Wil je een AppImage bijwerken of verwijderen? Gebruik dan het rechtermuisknopmenu van de snelkoppeling in je taakbalk of programmastarter.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">De map met de opgeslagen geïntegreerde AppImages is momenteel ingesteld op:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 is niet geïntegreerd op je systeem.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Werkomgevingsintegratie</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Integreren en starten</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Eén keer starten</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Annuleren</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Vewijdert AppImages nadat ze zijn geïntegreerd, voor gebruik door Linux-distributies</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher-verwijdering</translation>\n    </message>\n    <message>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</source>\n        <translation type=\"vanished\">Hulpprogramma om geïntegreerde AppImages eenvoudig te verwijderen, bijv. uit rechtermuisknopmenu&apos;s</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>Hulpprogramma om geïntegreerde AppImages eenvoudig te verwijderen, bijv. uit rechtermuisknopmenu&apos;s</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Pad naar AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;pad&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>Fout tijdens verwijderen van AppImage</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">Fout tijdens verwijderen van AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>Geen AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Er kan niet worden gewerkt met niet-geïntegreerde AppImages:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Bevestig</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Weet je zeker dat je deze AppImage wilt verwijderen?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Kan AppImage niet weghalen: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>Kan AppImage niet verplaatsen naar de prullenbak</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Kan AppImage niet verwijderen: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>Er is al een geïntegreerde AppImage met deze naam.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Wil je de bestaande AppImage overschrijven?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Kies &apos;Nee&apos; om de AppImage eenmaal te starten en het systeem verder onaangetast te laten.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Waarschuwing</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Kan AppImage niet verplaatsen naar doellocatie</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Kan AppImage niet vastleggen in systeem middels libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Kan geïntegreerd .desktop-bestand niet vinden</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>Kan AppImage&apos;s geïntegreerd .desktop-bestand niet vinden</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Kan .desktop-bestand niet laden:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>AppImage bevat een ongeldig .desktop-bestand</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Kan AppImage niet verplaatsen naar de doellocatie.\nWil je de AppImage proberen te kopiëren?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Kan stat() niet aanroepen op pad:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Kan AppImage niet kopiëren naar doellocatie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Werkt AppImages bij na werkomgevingsintegratie, voor gebruik door Linux-distributies</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>AppImageLauncher-bijwerking</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">De AppImage is nog niet geïntegreerd. Met dit hulpmiddel wordt de bijgewerkte AppImage geïntegreerd.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Wil je doorgaan?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Geen update beschikbaar</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Geen update beschikbaar voor AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Kan niet controleren op updates. Bekijk de opdrachtregeluitvoer voor meer informatie.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>Geen update-informatie aangetroffen</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Geen update-informatie aangetroffen in AppImage:\n%1\n\nDeze AppImage heeft geen update-ondersteuning. Vraag de makers om update-informatie in te stellen zodat je makkelijk kunt updaten.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Geen update-informatie aangetroffen in AppImage:\n%1\n\nDeze AppImage heeft geen update-ondersteuning. Vraag de makers om update-informatie in te stellen zodat je makkelijk kunt updaten.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Kan niet controleren op updates:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>Er is een update beschikbaar van AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Wil je de update nu installeren?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Oude AppImage verwijderen na installeren van update</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Kan AppImage niet bijwerken:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>Bijgewerkt bestand bestaat niet: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Kan bijgewerkte AppImage niet vastleggen op systeem</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Kan oude AppImage niet weghalen van systeem</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Kan oude AppImage niet verwijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>Zoekt naar AppImages in programmamappen (gebruikers-, systeem- en andere mappen). Integreert automatisch AppImages die in deze mappen worden geplaatst en maakt de integratie ongedaan als ze worden verwijderd.</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories in suitable mounted filesystems</source>\n        <translation type=\"vanished\">Zoekt naar AppImages in de opgegeven /programmamappen op geschikte aangekoppelde bestandssystemen</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories suitable mounted filesystems</source>\n        <translation type=\"vanished\">Zoekt naar AppImages in de opgegeven /programmamappen op geschikte aangekoppelde bestandssystemen</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>Toont de door deze dienst bijgehouden mappen en sluit af</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Bevestig</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Weet je zeker dat je deze AppImage wilt verwijderen?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>AppImage verwijderen</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Weet je zeker dat je deze AppImage wilt verwijderen?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Vink uit om alleen de werkomgevingsintegratie te verwijderen, maar het bestand te bewaren.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">AppImage-bestand verwijderen van systeem</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>AppImageLauncher-instellingen</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher</source>\n        <translation type=\"vanished\">AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Startvenster</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Vragen of AppImage-bestanden verplaatst moeten worden naar de programmamap</translation>\n    </message>\n    <message>\n        <source>appimagelauncherd</source>\n        <translation type=\"vanished\">appimagelauncherd</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Algemene instellingen</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Kruis dit aan om AppImageLauncher automatisch op te starten als achtergronddienst genaamd appimagelauncherd.&lt;/p&gt;&lt;p&gt;Deze dienst integreert automatisch AppImages die je kopieert naar de map &amp;quot;Programma&apos;s&amp;quot; en andere mappen die je hebt opgegeven. Als de bestanden worden verwijdert, dan schoont de dienst de integratiegegevens op.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Integratiedienst automatisch starten</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>Aanvullende bij te houden mappen</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>Map toevoegen aan lijst</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>Geselecteerde map verwijderen van lijst</translation>\n    </message>\n    <message>\n        <source>-</source>\n        <translation type=\"vanished\">-</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Programmamap</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Kruis dit aan om de dienst automatisch AppImages te laten integreren die je kopieert naar de map &amp;quot;Programma&apos;s&amp;quot;. Als de bestanden worden verwijdert, dan schoont de dienst de integratiegegevens op.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Pad naar programmamap</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Locatie waar je de AppImage-bestanden kunt plaatsen</translation>\n    </message>\n    <message>\n        <source>Location where to store your AppImage files to ease their management using the file manager.</source>\n        <translation type=\"vanished\">Locatie waar je de AppImage-bestanden kunt plaatsen middels de bestandsbeheerder.</translation>\n    </message>\n    <message>\n        <source>/path</source>\n        <translation type=\"vanished\">/pad</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Integratiedienst gebruiken</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Beschikbare functies</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>updater beschikbaar voor AppImages die ondersteuning hebben voor AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>geen updater beschikbaar</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Let op: dit is de AppImageLauncher Lite-versie. Deze ondersteunt slechts een beperkt aantal functies.&lt;/strong&gt;&lt;br /&gt;Installeer de volledige versie om AppImageLauncher volledig te benutten</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Programmamap kiezen</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>Aanvullende bij te houden mappen selecteren</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.pl.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"pl\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Pierwsze uruchomienie</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Witaj w AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ten mały program został napisany, aby ułatwić korzystanie z plików AppImage na twoim komputerze.&lt;/p&gt;&lt;p&gt;Wygląda na to, że nigdy wcześniej nie korzystałeś z AppImageLauncher. Poświęć chwilę i skonfiguruj swoje preferencje. Zawsze możesz je później zmienić za pomocą panelu sterowania.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Pytaj czy przenieść nowe pliki AppImages do centralnej lokalizacji</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Docelowy katalog integracji:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Dostosuj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Wybierz docelowy katalog do integracji</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(domyślny)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Integracja z pulpitem</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Zintegruj i uruchom</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Uruchom jeden raz</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Ostrzeżenie</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage został już zintegrowany, ale nie ma go w bieżącym katalogu docelowym integracji.\n\nCzy chcesz przenieść go do nowego miejsca docelowego?\nWybranie opcji Nie spowoduje uruchomienie AppImage jeden raz i pozostawienie AppImage w bieżącym katalogu.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>AppImage %1 został już zintegrowany, ale nie ma go w bieżącym docelowym katalogu integracji.\n\nCzy chcesz przenieść go do nowego miejsca docelowego?\n\nWybranie opcji Nie spowoduje uruchomienie AppImage jeden raz i pozostawienie AppImage w bieżącym katalogu.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Błąd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Nie udało się wyrejestrować AppImage przed ponownym zintegrowaniem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Nie można przeanalizować tłumaczeń plików pulpitu:\nNie można otworzyć pliku do odczytu:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Nie można przeanalizować tłumaczeń plików pulpitu:\nNiepoprawna składnia:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>Plik %1 jest własnością innego użytkownika: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Problem z uprawnieniami</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">Plik %1 jest własnością innego użytkownika: %2\n\nUruchomić ponownie z jego uprawnieniami?</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>Nie udało się uruchomić pomocnika uprawnień, zakończono z błędem %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Nie można znaleźć odpowiedniego pomocnika uprawnień, przerywam</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Błąd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher obecnie nie obsługuje plików AppImage typu %1.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Nie udało się nadać plikowi AppImage: %1 uprawnień do wykonania</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Nie można otworzyć AppImage do odczytu: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Nie udało się utworzyć katalogu tymczasowego</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Nie udało się utworzyć tymczasowej kopii AppImage typu 1</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Nie udało się otworzyć tymczasowej kopii AppImage do zapisu</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Nie udało się usunąć sygnatury z tymczasowej kopii AppImage</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() zakończył się błędem: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">nie znaleziono środowiska wykonawczego: brak takiego pliku albo katalogu: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() zakończył się błędem: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Zastosowanie: %1 [opcje] &lt;ścieżka&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Pomocnik integracji pulpitu dla plików AppImage dla dystrybucji Linuksa.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Opcje:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Wyświetl tę pomoc i zakończ</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Wyświetl wersję i zakończ</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argumenty:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Ścieżka do AppImage (obowiązkowa)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Nie udało się wykasować starych plików pulpitu</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Nie udało się zarejestrować AppImage w AppImageLauncherFS: błąd podczas próby uruchomienia appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Nie udało się zarejestrować AppImage w AppImageLauncherFS: rejestracja ścieżki AppImage %1 nie powiodła się</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Nie udało się zarejestrować AppImage w AppImageLauncherFS: nie można otworzyć pliku map</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Nie udało się zarejestrować AppImage w AppImageLauncherFS: nie można znaleźć pliku wirtualnego dla AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Nie udało się zarejestrować AppImage w AppImageLauncherFS: nieznana przyczyna</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Nie udało się wyczyścić kosza aplikacji AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Nieznana opcja AppImageLauncher: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Błąd: brak takiego pliku lub katalogu: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>To nie jest AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>Katalogiem, w którym przechowywane są zintegrowane pliki AppImage, jest obecnie:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">Katalogiem, w którym przechowywane są zintegrowane pliki AppImage, jest obecnie: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">Integracja tego pliku spowoduje przeniesienie AppImage do predefiniowanego katalogu i dodanie go do menu aplikacji.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Aby usunąć lub zaktualizować AppImage, użyj menu kontekstowego ikony aplikacji na pasku zadań lub w menu aplikacji.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">Katalogiem, w którym przechowywane są zintegrowane pliki AppImage, jest obecnie:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 nie został zintegrowany z twoim systemem.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Integracja z pulpitem</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Zintegruj i uruchom</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Uruchom jeden raz</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Anuluj</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Usuwa pliki AppImage po integracji z komputerem, do użytku w systemach Linuks</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">Usuń AppImageLauncher</translation>\n    </message>\n    <message>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</source>\n        <translation type=\"vanished\">Program do łatwego usuwania zintegrowanych plików AppImage, np. z menu kontekstowego aplikacji</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>Program do łatwego usuwania zintegrowanych plików AppImage, np. z menu kontekstowego aplikacji</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Ścieżka do AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;ścieżka&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>Błąd programu kasowania AppImage</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">Błąd programu usuwania AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>To nie jest AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Odmowa pracy z niezintegrowanym plikiem AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Proszę potwierdzić</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Czy na pewno chcesz usunąć ten plik AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Nie udało się wyrejestrować AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>Nie udało się przenieść AppImage do katalogu kosza na śmieci</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Nie udało się usunąć pliku AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>AppImage z tą samą nazwą pliku został już zintegrowany.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Czy chcesz zastąpić istniejący AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Wybranie opcji Nie spowoduje uruchomienie AppImage jeden raz i pozostawienie systemu bez zmian.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Ostrzeżenie</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Nie udało się przenieść AppImage do lokalizacji docelowej</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Nie udało się zarejestrować AppImage w systemie via libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Nie udało się znaleźć zintegrowanego pliku pulpitu</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>Nie można znaleźć zintegrowanego pliku pulpitu AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Nie udało się załadować pliku pulpitu:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>AppImage plik pulpitu jest nieprawidłowy</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Nie udało się przenieść AppImage do lokalizacji docelowej.\nCzy zamiast tego spróbować skopiować AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Nie można wywołać stat () na ścieżce:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Nie udało się skopiować AppImage do lokalizacji docelowej</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Aktualizuje AppImages po integracji z komputerem, do użytku przez dystrybucje Linuksa</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>Aktualizacja AppImageLauncher</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">AppImage nie był wcześniej zintegrowany. To narzędzie zintegruje zaktualizowany AppImage.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Czy chcesz kontynuować?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Nie znaleziono aktualizacji</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Nie można znaleźć aktualizacji dla AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Nie udało się sprawdzić aktualizacji. Szczegóły sprawdź w wierszu poleceń.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>Nie znaleziono informacji o aktualizacji</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Nie można znaleźć informacji o aktualizacji w AppImage:\n%1\n\nAppImage nie obsługuje aktualizacji. Poproś autorów o ich dodanie, aby umożliwić łatwą aktualizację.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Nie można znaleźć informacji o aktualizacji w AppImage:\n%1\n\nAppImage nie obsługuje aktualizacji. Poproś autorów o ich dodanie, aby umożliwić łatwą aktualizację.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Nie udało się sprawdzić aktualizacji:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>Znaleziono aktualizację dla AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Czy chcesz zaktualizować?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Usuń starą aplikację AppImage po udanej aktualizacji</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Nie udało się zaktualizować AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>Plik zgłoszony jako zaktualizowany nie istnieje: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Nie udało się zarejestrować zaktualizowanego AppImage w systemie</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Nie udało się wyrejestrować starej aplikacji AppImage z systemu</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Nie udało się usunąć starego AppImage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>Śledzi pliki AppImage w katalogach aplikacji (użytkownika, systemu i innych). Automatycznie integruje pliki AppImage przeniesione do tych katalogów i wyrejestrowuje pliki z nich usunięte.</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories in suitable mounted filesystems</source>\n        <translation type=\"vanished\">Wyszukaj pliki AppImage w katalogach /Aplikacje w odpowiednio zamontowanych systemach plików</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories suitable mounted filesystems</source>\n        <translation type=\"vanished\">Wyszukaj pliki AppImage w katalogach /Aplikacje odpowiednio zamontowanych systemach plików</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>Wyświetl listę katalogów śledzonych przez proces demona i zakończ działanie</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Proszę potwierdzić</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Czy na pewno chcesz usunąć ten AppImage?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>Wykasuj AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Czy na pewno chcesz wykasować ten AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Odznacz, aby usunąć tylko integrację pulpitu, ale pozostaw plik w systemie.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">Usuń plik AppImage z systemu</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>Ustawienia AppImageLauncher</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher</source>\n        <translation type=\"vanished\">AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Okno dialogowe uruchamiania</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Zapytaj, czy przenieść pliki AppImage do katalogu aplikacji</translation>\n    </message>\n    <message>\n        <source>appimagelauncherd</source>\n        <translation type=\"vanished\">appimagelauncherd</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Ustawienia główne</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Gdy to pole jest zaznaczone, AppImageLauncher automatycznie uruchamia proces demona o nazwie appimagelauncherd.&lt;/p&gt;&lt;p&gt;Ten demon automatycznie integruje skopiowane AppImages do &amp;quot;katalogu aplikacji&amp;quot; i skonfigurowanych dodatkowych katalogów. Po usunięciu plików demon wyczyści dane integracji.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Automatycznie uruchamiaj demona integracji</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>Dodatkowe katalogi do śledzenia</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>Dodaj nowy katalog do listy</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>Usuń wybrany katalog z listy</translation>\n    </message>\n    <message>\n        <source>-</source>\n        <translation type=\"vanished\">-</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Katalog aplikacji</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Po włączeniu procesu demona automatycznie integruje pliki AppImage, które kopiujesz do &amp;quot;katalogu aplikacji&amp;quot;. Po usunięciu plików demon wyczyści dane integracji.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Ścieżka do katalogu aplikacji</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Miejsce przechowywania plików AppImage w celu ułatwienia zarządzania nimi</translation>\n    </message>\n    <message>\n        <source>Location where to store your AppImage files to ease their management using the file manager.</source>\n        <translation type=\"vanished\">Miejsce przechowywania plików AppImage w celu ułatwienia zarządzania nimi za pomocą menedżera plików.</translation>\n    </message>\n    <message>\n        <source>/path</source>\n        <translation type=\"vanished\">/ścieżka</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Włącz proces demona automatycznej integracji</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Dostępne funkcje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>aktualizator dostępny dla plików AppImage obsługujących AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>aktualizator niedostępny</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Uwaga: jest to wersja AppImageLauncher Lite, obsługująca tylko ograniczony zestaw funkcji&lt;/strong&gt;&lt;br /&gt;Zainstaluj pełną wersję korzystając z dostępnych programów instalacyjnych, aby cieszyć się pełną funkcjonalnością AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Wybierz katalog aplikacji</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>Wybierz dodatkowy katalog do śledzenia</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.pt.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"pt_PT\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Primeira execução</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Bem-vindo à AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Este mini-ajudante foi desenhado para melhorar a sua experiência da AppImage no seu computador.&lt;/p&gt;&lt;p&gt;Parece que nunca tinha utilizado a AppImageLauncher anteriormente. Por favor, tenha um minuto e configure as suas preferências. Pode sempre alterá-las mais tarde, com o painel de controle.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Preguntar se devo mudar as novas AppImages para uma directoria dedicada</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Directoria para integração das suas AppImages:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Personalizar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Escolha a directoria de integração das AppImages</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(padrão)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Integração no desktop</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Integrar e executar</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Executar Uma Vez</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Aviso</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>AppImage %1 já foi integrada com o seu ambiente de trabalho, mas não está situada na actual directoria de integração .\n\nQuer mudar para uma nova localização ?\n\nEscolhendo &quot;Não&quot;, a AppImage será executada e deixada na sua localização atual.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Erro</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Falha em eliminar todas as partes da integração anterior antes de a reintegrar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Não foi possível analisar as traduções do ficheiro no ambiente de trabalho:\nNão é possível abrir o ficheiro para leitura:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Não foi possível analisar as traduções de ficheiro no ambiente de trabalho:\nSintaxe inválida:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>Ficheiro %1 pertence a outro utilizador: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Problema de permissões</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">File %1 is owned by another user: %2\n\nRelaunch with their permissions?</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>Falha em executar o ajudante de permissões; sair com o código de retorno %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Não foi encontrado um ajudante de permissões adequado, cancelando</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Falha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher não suporta atualmente AppImages do tipo %1.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Não foi possível tornar a AppImage executável: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Failed to open AppImage for reading: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Failed to create temporary directory</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Failed to create temporary copy of type 1 AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Failed to open temporary AppImage copy for writing</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Failed to remove magic bytes from temporary AppImage copy</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() failed: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime not found: no such file or directory: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() falhou: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Utilização: %1 [opções] &lt;caminho&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Ajudante de integração das AppImages, para ser utilizado nas distribuições do Linux.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Opções:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Mostrar esta ajuda e sair</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Mostrar versão e sair</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argumentos:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Caminho para AppImage (necessário)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Falha na eliminação de ficheiros antigos do ambiente de trabalho</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Falha ao registar o AppImage no AppImageLauncherFS: erro ao iniciar o serviço systemd de utilizador do appimagelauncherfs</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Falha ao registar o AppImage no AppImageLauncherFS: incapaz de registar o caminho do AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Falha ao registar o AppImage no AppImageLauncherFS: não pôde abrir o ficheiro de mapa</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Falha ao registar o AppImage no AppImageLauncherFS:não foi encontrado o ficheiro virtual para AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Falha ao registar o AppImage no AppImageLauncherFS: falha desconhecida</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Falha em limpar a directoria de reciclagem das AppImages: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Opção de AppImageLauncher desconhecida: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Erro: ficheiro ou directoria inexistente :%1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Não é uma AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>A directoria das AppImages integradas esta configurada na seguinte localização:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">The directory the integrated AppImages are stored in is currently set to: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">integrando ira mover a AppImage para uma localização predefinida, ira incluir no lançador de aplicações.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Para remover ou actualizar a Appimage, devera utilizar o icone da sua aplicação no menu ou na barra de lançamento.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">A directoria das AppImages integradas esta configurada para seguinte localização :</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">Não foi integrado no seu sistema.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Integração no desktop</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Integrar e executar</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Executar Uma Vez</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Cancelar</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Removes AppImages after desktop integration, for use by Linux distributions</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher remove</translation>\n    </message>\n    <message>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</source>\n        <translation type=\"vanished\">Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>Ajuda para apagar facilmente as AppImages integradas, p. ex., a partir do menu do lançador de aplicativos</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Caminho para AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;path&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>Apagar AppImage erro de ajuda</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage remove helper error</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>Não é uma AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Refusing to work on non-integrated AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Are you sure you want to remove this AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Falha ao cancelar registro AppImage:% 1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>Falha a mover AppImage para a directoria de reciclagem</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Failed to remove AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>AppImage com o mesmo nome já foi integrada.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Deseja substituir a AppImage existente ?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Se escolher &quot;Não&quot; executará a AppImage uma vez , e não ira fazer qualquer alteração no seu sistema.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Aviso</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Failed to move AppImage to target location</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Falha ao registrar AppImage no sistema via libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Falhou encontrar o ficheiro:integrated desktop</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>Não foi encontrado o ficheiro desktop de integração da Appimage</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Falhou a carregar o ficheiro desktop :</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>O ficheiro desktop da AppImage não é valido</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Falha em mover a AppImage para localização alvo.\nTentar copiar AppImage ?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Falha em ligar stat() on path:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Failed to copy AppImage to target location</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Actualiza as AppImages depois da integração no ambiente de trabalho , para ser utilizado pelas distribuições Linux</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>Actualizar o AppImageLauncher</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Do you wish to continue?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Não foram encontradas actualizações</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Não foi possível encontrar actualizações para esta AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Failed to check for updates. Please check the command line output for details.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>Não foi encontrada informação para actualização</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation>Não foi encontrada informação de atualização dentro da AppImage\n%1\n\nEsta AppImage não suporta actualização.Peça aos autores para incorporar informações de actualização para permitir uma actualização fácil.</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Falhou a verificação para actualizações\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>Uma actualização foi encontrada para esta AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Deseja realizar a actualização ?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Remover antiga AppImage depois da actualização bem sucedida</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Falha na actualização da AppImage\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>Ficheiro relatado como actualizado não existe: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Falhou a registar actualização da AppImage no sistema</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Falha em remover o registro da atinga AppImage no sistema</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Falha em remover a antiga AppImage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>Procura AppImages em directorias de aplicações (de utilizador , sistema e outras). Integra automaticamente as AppImages transferidas para essas directorias e desintegra as removidas delas.</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories in suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories in suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>Lista directorias observadas por este daemon e sai</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>Apagar AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Tem a certeza que quer apagar esta AppImage ?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">Remove AppImage file from system</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>Configurações do AppImageLauncher</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher</source>\n        <translation type=\"vanished\">AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Guia de iniciação</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Perguntar se quer deslocar os ficheiros AppImage para a directoria de integração</translation>\n    </message>\n    <message>\n        <source>appimagelauncherd</source>\n        <translation type=\"vanished\">appimagelauncherd</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Configurações gerais</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Quando esta caixa é marcada, o AppImageLauncher inicia automaticamente um daemon chamado appimagelauncherd.&lt;/p&gt;&lt;p&gt;Este daemon integra automaticamente AppImages que você copia na &amp;quot;pasta de aplicações&amp;quot; e as pastas adicionais que você configurou. Quando as AppImages são apagadas, o daemon vai limpar os dados de integração.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Iniciar automaticamente o daemon de integração</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>Directorias adicionais para observar</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>Adicionar nova directoria à lista</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>Retirar a directoria seleccionada da lista</translation>\n    </message>\n    <message>\n        <source>-</source>\n        <translation type=\"vanished\">-</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Applications directory</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Caminho da directoria de aplicações</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Localização para alojar as suas AppImages para facilitar a sua gestão</translation>\n    </message>\n    <message>\n        <source>Location where to store your AppImage files to ease their management using the file manager.</source>\n        <translation type=\"vanished\">Location where to store your AppImage files to ease their management using the file manager.</translation>\n    </message>\n    <message>\n        <source>/path</source>\n        <translation type=\"vanished\">/path</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Enable auto-integration daemon</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Funcionalidades disponíveis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>actualizador disponível para AppImages que suporta AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>actualizador indisponível</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Nota: esta é uma versão do AppImageLauncher Lite, que oferece um limitado conjunto de funcionalidades&lt;/strong&gt;&lt;br /&gt;Por favor, instalar a versão completa através do gestor de pacotes do seu sistema para beneficiar da experiência completa do AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Seleccionar a directoria de Aplicações</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>Seleccionar directoria adicional a observar</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.pt_BR.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"pt\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Primeira execução</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Bem-vindo ao AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Sou um ajudante projetado para melhorar a experiência do AppImage no seu computador.&lt;/p&gt;&lt;p&gt;Parece que você nunca executou o AppImageLauncher antes. Por favor, reserve um momento para configurar suas preferências antes de começar a usá-lo. Sempre pode alterá-los novamente usando o painel de controle.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Pergunte-me se devo mudar os AppImages para uma localização central</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Pasta de destino para os AppImages integrados:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Personalizar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Escolher pasta de destino para integração</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(padrão)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Integração no Ambiente de Trabalho</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Integrar e executar</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Executar uma vez</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Aviso</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">O AppImage já foi integrado, mas não se encontra no atual diretório destinado à integração.\n\nQuer move-la para o novo destino?\nEscolher Não, irá executar o AppImage uma vez e mantê-lo no diretório em que se encontra.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>A AppImage %1 já foi integrada, mas não se encontra no atual diretória destinado à integração.\n\nQuer move-la para a nova directória?\n\nEscolher Não, irá executar o AppImage uma vez e mantê-lo no diretório em que se encontra.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Erro</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Falha ao desregistrar o AppImage antes de a reintegrar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Não foi possível processar as traduções do ficheiro do ambiente de trabalho:\nNão foi possível abrir o ficheiro para leitura:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Não foi possível processar as traduções do ficheiro do ambiente de trabalho:\nSintaxe inválida:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>Ficheiro %1 é propriedade de outro utilizador: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Problema das permissões</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>A execução do ajudante de permissões falhou com o código de saída %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Não foi encontrado um ajudante de permissões adequado, abortando</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Erro</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher não suporta o tipo %1 AppImages de momento.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Não foi possível tornar o AppImage em um executável: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Falha ao abrir o AppImage para leitura: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Falha ao criar o diretório temporário</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Falha ao criar uma cópia temporária do AppImage tipo %1</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Falha ao abrir cópia temporária do AppImage para escrita</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Falha ao remover bytes mágicos da cópia temporária do AppImage</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() falhou: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime não encontrado: não existe o ficheiro ou directoria: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() falhou: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Utilização: %1 [options] &lt;path&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Assistente de integração em ambiente de trabalho de AppImages, para utilização em distribuições Linux.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Opções:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Mostrar esta ajuda e sair</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Mostrar versão e sair</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argumentos:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Caminho para AppImage (mandatário)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Falha ao limpar ficheiros de ambientes de trabalho antigos</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Falha ao registar AppImage no AppImageLauncherFS: erro no inicio do appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Falha ao registar o AppImage no AppImageLauncherFS: não registou a AppImage caminho %1</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Falha ao registar o AppImage no AppImageLauncherFS: não pôde abrir o ficheiro do mapa</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Falha ao registar o AppImage no AppImageLauncherFS: não foi encontrado um ficheiro virtual para o AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Falha ao registar AppImage no AppImageLauncherFS: falha desconhecida</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Falha ao limpar a lixeira AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Opção AppImageLauncher desconhecida: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Erro: ficheiro ou diretório não existe: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Não é um AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>O diretório dos AppImages integrados está definida como:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">O diretório onde os AppImages integrados são armazenadas está actualmente definida como: %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">Ao integrar, a AppImage será movida para uma localização predefinida e incluída no seu menu de aplicações.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Para remover ou atualizar a AppImage, por favor use o menu de contexto do ícone da aplicação existente na barra de tarefas ou no menu de aplicações.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">A pasta em que os AppImages integradps são armazenados está configurada actualmente:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 não foi integrado no seu sistema.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Integração no Ambiente de Trabalho</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Integrar e executar</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Executar uma vez</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Cancelar</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Remove AppImages após integração no ambiente de trabalho, para usar em distribuições Linux</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">Remover AppImageLauncher</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>Ajudante para eliminar facilmente os AppImages integrados, por exemplo, do menu de contexto do iniciador de aplicações</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Caminho para AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>Erro do ajudante de eliminação de AppImage</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">Erro no Assistente de Remoção de AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>Não é um AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Por favor, confirme</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Tem a certeza que deseja remover este AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Falha ao desregistrar AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>Falha ao mover AppImage para o diretório da lixeira</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Falha a remover AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>AppImage com o mesmo nome já foi integrado.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Pretende sobrescrever o AppImage existente?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Escolher Não irá executar o AppImage uma vez e deixar o sistema no seu estado actual.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Aviso</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Falha ao mover o AppImage para a localização de destino</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Falha ao registar AppImage no sistema via libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Falha ao encontrar ficheiro de ambiente de trabalho integrado</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>Não foi possível encontrar o ficheiro de ambiente de trabalho integrado do AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Falha ao carregar o ficheiro de ambiente de trabalho:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>AppImage tem um ficheiro de ambiente de trabalho inválido</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>Falha ao mover AppImage para a localização de destino.\nTentar copiar a AppImage em vez disso?</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>Falha em ligar stat() no caminho:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Falha ao copiar o AppImage para a localização de destino</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Atualiza AppImages após a integração em ambiente de trabalho, para uso em distribuições Linux</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>Atualizar AppImageLauncher</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">O AppImage não foi integrado antes. Esta ferramenta irá, porém, integrar o AppImage atualizado.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Pretende continuar?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Não foram encontradas atualizações</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Não existem atualizações para AppImage %1</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Falha ao pesquisar atualizações. por favor verifique o output da linha de comandos para detalhes.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>Nenhuma informação de atualizações disponível</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Não foi possível encontrar informações de atualização no AppImage:\n%1\n\nEste AppImage não suporta actualização. Por favor, peça aos autores para adicionarem informações necessárias para proporcionar uma atualização mais fácil.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">As informações de atualização não estão disponíveis no AppImage:\n%1\n\nEste AppImage não suporta atualização. Por favor, solicitar aos desenvolvedores que adicionem suporte para atualizações automáticas em um próximo lançamento.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Falha a pesquisar por actualizações:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>Uma atualização foi encontrada para o AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Pretende realizar a atualização?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Remover o AppImage antigo após uma atualização com sucesso</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Falha ao atualizar o AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>Ficheiro reportado com atualizado não existe: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Falha ao registar o AppImage atualizado no sistema</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Falha a desregistrar o AppImage antigo do sistema</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Falha ao remover o AppImage antigo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>Rastreia AppImages em pastas de aplicações (de usuário, sistema e outras). Integra automaticamente os AppImages transferidos para essas pastas e desintegra os removidos delas.</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>Listar pastas observadas por este daemon e sair</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"obsolete\">Por favor confirme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>Apagar AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Tem a certeza que quer apagar este AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>Configurações do AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>Guia de iniciação</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>Perguntar se quer deslocar os ficheiros AppImage para a pasta de integração</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>Configurações gerais</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Quando esta caixa é marcada, o AppImageLauncher inicia automaticamente um daemon chamado appimagelauncherd.&lt;/p&gt;&lt;p&gt;Este daemon integra automaticamente AppImages que você copia na &amp;quot;pasta de aplicações&amp;quot; e as pastas adicionais que você configurou. Quando as AppImages são apagadas, o daemon vai limpar os dados de integração.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>Iniciar automaticamente o daemon de integração</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>Pastas adicionais para observar</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>Adicionar nova pasta à lista</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>Retirar a pasta seleccionada da lista</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>Caminho da pasta de aplicações</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>Localização para armazenar os seus AppImages para facilitar a sua gestão</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>Funcionalidades disponíveis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>atualizadoe disponível para AppImages que suporta AppImageUpdate</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>atualizador indisponível</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;Nota: esta é uma versão do AppImageLauncher Lite, que oferece um limitado conjunto de funcionalidades&lt;/strong&gt;&lt;br /&gt;Por favor, instale a versão completa através do gestor de pacotes do seu sistema para beneficiar a experiência completa do AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Seleccionar pasta de Aplicações</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>Seleccionar pasta adicional para observar</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.pt_PT.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"pt_PT\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Primeira execução</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;O AppImageLauncher agora está ativo no seu sistema!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Esperamos que melhore a experiência AppImage no seu computador, ao armazenar as AppImages que instalar numa única pasta e ao adicionar entradas correspondentes ao seu lançador de aplicações.&lt;/p&gt;&lt;p&gt;Não foi possível encontrar um ficheiro de configuração; será criado um automaticamente com as suas selecções a seguir. Pode sempre alterar estas configurações mais tarde, ao lançar AppImageLauncher Settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Pedir para mudar as AppImages detectados novamente para a pasta de gestão</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Pasta para armazenar AppImages geridos:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Personalizar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Escolher uma pasta para armazenar AppImages geridas</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(padrão)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Aviso</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>O AppImage %1 já foi integrado, mas não se encontra na pasta de armazenamento para AppImages geridos.\n\nQuer movê-la para lá agora?\n\nClique Não para evitar AppImageLauncher e iniciar o AppImage diretamente da sua localização atual.\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Erro</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>Falha ao eliminar a integração do sistema para o AppImage antes de o reintegrar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>Incapaz de analisar as traduções no ficheiro de ambiente de trabalho.\nNão foi possível abrir o ficheiro:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>Incapaz de analisar as traduções em ficheiro do ambiente de trabalho.\nSintaxe inválida:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>O ficheiro %1 pertence a outro utilizador: %2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>Erro: Não há permissões necessárias do sistema de ficheiros</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">File %1 is owned by another user: %2\n\nRelaunch with their permissions?</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>Falha em executar o ajudante de permissões, saído com o código de retorno %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>Não foi encontrado um ajudante de permissões adequado, a cancelar</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Falha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher não apoia AppImages do tipo %1 actualmente.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Não foi possível definir permissão executável para AppImage: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Failed to open AppImage for reading: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Failed to create temporary directory</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Failed to create temporary copy of type 1 AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Failed to open temporary AppImage copy for writing</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Failed to remove magic bytes from temporary AppImage copy</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() failed: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime not found: no such file or directory: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() falhou: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Utilização: %1 [opções] &lt;caminho&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Ajudante de integração de ambiente de trabalho para AppImages, para utilização por distribuições Linux.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Opções:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Mostrar esta ajuda e sair</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Mostrar versão e sair</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Argumentos:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Caminho para AppImage (necessário)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Falha na limpeza de ficheiros de entrada no ambiente de trabalho antigos</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: could not open map file</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: unknown failure</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>Falha na limpeza do caixote do lixo AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Opção desconhecida do AppImageLauncher: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Erro: nenhum ficheiro ou pasta: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Não é um AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>Atualmente, os AppImages integrados neste sistema são armazenados na pasta:\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">The directory the integrated AppImages are stored in is currently set to: %1</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Removes AppImages after desktop integration, for use by Linux distributions</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher remove</translation>\n    </message>\n    <message>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</source>\n        <translation type=\"vanished\">Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage remove helper error</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Refusing to work on non-integrated AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Are you sure you want to remove this AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Failed to remove AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation type=\"unfinished\">Aviso</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Failed to move AppImage to target location</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Failed to copy AppImage to target location</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Do you wish to continue?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Failed to check for updates. Please check the command line output for details.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories in suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories in suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">Remove AppImage file from system</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>AppImageLauncher</source>\n        <translation type=\"vanished\">AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>appimagelauncherd</source>\n        <translation type=\"vanished\">appimagelauncherd</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>-</source>\n        <translation type=\"vanished\">-</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Applications directory</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Location where to store your AppImage files to ease their management using the file manager.</source>\n        <translation type=\"vanished\">Location where to store your AppImage files to ease their management using the file manager.</translation>\n    </message>\n    <message>\n        <source>/path</source>\n        <translation type=\"vanished\">/path</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Enable auto-integration daemon</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.ru.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"ru\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>Первый запуск</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(по умолчанию)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">Интеграция с рабочим столом</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">Интегрировать и запустить</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">Одиночный запуск</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Предупреждение</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Ошибка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Ошибка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher в данный момент не поддерживает AppImage %1 типа.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>Невозможно сделать файл AppImage исполняемым: %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Не удалось открыть AppImage для чтения: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Не удалось создать временный каталог</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Не удалось создать временную копию AppImage 1 типа</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Не удалось открыть временную копию AppImage для записи</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Не удалось стереть сигнатуру из временной копии AppImage</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() не сработал: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">рантайм не найден, файл или каталог не существует: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() не сработал: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>Использование: %1 [опции] &lt;путь&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>Помощник интеграции AppImage-пакетов с рабочим столом, подходит для использования в любом дистрибутиве Linux.</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>Опции:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>Показать это сообщение и выйти</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>Показать версию и выйти</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>Аргументы:</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>Путь к AppImage (обязателен)</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>Не удалось очистить старые desktop-файлы</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>Неизвестная опция для AppImageLauncher: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>Ошибка, файл или каталог не существует: %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>Это не AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">Интеграция переместит файл AppImage в каталог, определённый заранее, и добавит пункт в меню запуска приложений.</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">Удалить или обновить AppImage можно в контекстном меню у иконки приложения.</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">В данный момент файлы AppImage хранятся в каталоге:</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 не был интегрирован с вашей системой.</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">Интеграция с рабочим столом</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">Интегрировать и запустить</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">Одиночный запуск</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Отмена</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Удаляет AppImage-пакеты, интегрированные с рабочим столом</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher удаление</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>Путь к AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;путь&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">Ошибка средства удаления AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Подтверждение</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Вы уверены, что хотите удалить этот AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>Не удалось снять регистрацию AppImage: %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Ошибка при удалении AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>AppImage с таким же именем уже был интегрирован.</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>Хотите ли вы перезаписать существующий AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>Выбор пункта &quot;Нет&quot; запустит AppImage и оставит систему без изменений.</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>Предупреждение</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Не удалось переместить AppImage в указанное место</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>Не удалось зарегистрировать AppImage в системе с помощью libappimage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>Не удалось найти интегрированный desktop-файл</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>Не удалось найти интегрированный desktop-файл</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>Не удалось загрузить desktop-файл:</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>У этого AppImage некорректный desktop-файл</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>Обновляет AppImage-пакеты, интегрированные с рабочим столом</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>AppImageLauncher обновление</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">Этот AppImage ещё не был интегрирован. Это будет сделано с обновлённым AppImage.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Хотите ли вы продолжить?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>Обновления не найдены</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>Не удалось найти обновления для AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>Не удалось проверить обновления:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>Найдено обновление для AppImage %1</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>Хотите ли вы совершить обновление?</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>Удалить старый AppImage после успешного обновления</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>Не удалось обновить AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>Обновлённый файл не существует: %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>Не удалось зарегистрировать в системе обновлённый AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>Не удалось снять регистрацию старого AppImage в системе</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>Ошибка при удалении старого AppImage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"obsolete\">Подтверждение</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>Удалить AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Вы уверены, что хотите удалить этот AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>Настройки AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Включить демон автоматической интеграции</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>Выбор директории приложений</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.tr.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"tr\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>İlk çalıştırma</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;AppImageLauncher uygulamasına hoş geldiniz!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Bu küçük yardımcı, bilgisayarınızdaki AppImage deneyiminizi iyileştirmek için tasarlanmıştır.&lt;/p&gt;&lt;p&gt;Görünüşe göre AppImageLauncher uygulamasını ilk defa çalıştırıyorsunuz. Lütfen bir dakikanızı ayırın ve tercihlerinizi yapılandırın. Bunları daha sonra kontrol panelini kullanarak istediğiniz zaman değiştirebilirsiniz.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>Yeni AppImages uygulamasının merkezi bir konuma taşınıp taşınmayacağını sor</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>Entegrasyon hedef dizini:</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>Özelleştir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>Entegrasyon hedef dizinini seçin</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>(varsayılan)</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>Uyarı</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>Hata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>İzin sorunu</translation>\n    </message>\n    <message>\n        <source>File %1 is owned by another user: %2\n\nRelaunch with their permissions?</source>\n        <translation type=\"vanished\">File %1 is owned by another user: %2\n\nRelaunch with their permissions?</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>Hata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">Failed to open AppImage for reading: %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">Failed to create temporary directory</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">Failed to create temporary copy of type 1 AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">Failed to open temporary AppImage copy for writing</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">Failed to remove magic bytes from temporary AppImage copy</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() failed: %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">runtime not found: no such file or directory: %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation type=\"unfinished\">execv() failed: %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: could not open map file</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">Failed to register AppImage in AppImageLauncherFS: unknown failure</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">The directory the integrated AppImages are stored in is currently set to: %1</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">Removes AppImages after desktop integration, for use by Linux distributions</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher remove</translation>\n    </message>\n    <message>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</source>\n        <translation type=\"vanished\">Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menuz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage remove helper error</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">Refusing to work on non-integrated AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">Are you sure you want to remove this AppImage?</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">Failed to remove AppImage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation type=\"unfinished\">Uyarı</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">Failed to move AppImage to target location</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">Failed to copy AppImage to target location</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">Do you wish to continue?</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">Failed to check for updates. Please check the command line output for details.</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories in suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories in suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <source>Search for AppImages in /Applications directories suitable mounted filesystems</source>\n        <translation type=\"vanished\">Search for AppImages in /Applications directories suitable mounted filesystems</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">Please confirm</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">Remove AppImage file from system</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>AppImageLauncher</source>\n        <translation type=\"vanished\">AppImageLauncher</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>appimagelauncherd</source>\n        <translation type=\"vanished\">appimagelauncherd</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>-</source>\n        <translation type=\"vanished\">-</translation>\n    </message>\n    <message>\n        <source>Applications directory</source>\n        <translation type=\"vanished\">Applications directory</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled, the daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot;. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Location where to store your AppImage files to ease their management using the file manager.</source>\n        <translation type=\"vanished\">Location where to store your AppImage files to ease their management using the file manager.</translation>\n    </message>\n    <message>\n        <source>/path</source>\n        <translation type=\"vanished\">/path</translation>\n    </message>\n    <message>\n        <source>Enable auto-integration daemon</source>\n        <translation type=\"vanished\">Enable auto-integration daemon</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/ui.zh_Hans.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"zh_Hans\">\n<context>\n    <name>FirstRunDialog</name>\n    <message>\n        <location filename=\"../src/ui/first-run.ui\" line=\"+20\"/>\n        <source>First run</source>\n        <translation>首次运行</translation>\n    </message>\n    <message>\n        <location line=\"+55\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;欢迎使用 AppImageLauncher！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;这个小助手旨在改善您使用 AppImage 的体验。&lt;/p&gt;&lt;p&gt;看来您以前从未运行过 AppImageLauncher 。请花一点时间配置appimage launcher。您随后可以使用控制面板更改这些内容。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>Ask me whether to move new AppImages into a central location</source>\n        <translation>询问我是否要将新的 AppImage 移动到一个中心位置</translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>Integration target destination directory:</source>\n        <translation>存放已集成的目标目录：</translation>\n    </message>\n    <message>\n        <location line=\"+36\"/>\n        <source>Customize</source>\n        <translation>自定义</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/first-run.cpp\" line=\"+86\"/>\n        <source>Choose integration destination dir</source>\n        <translation>选择集成后appimage的存放目录</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>(default)</source>\n        <translation>（默认）</translation>\n    </message>\n</context>\n<context>\n    <name>IntegrationDialog</name>\n    <message>\n        <location filename=\"../src/ui/integration_dialog.ui\" line=\"+23\"/>\n        <source>Desktop Integration</source>\n        <translation type=\"unfinished\">桌面集成</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+21\"/>\n        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"+41\"/>\n        <source>Integrate and run</source>\n        <translation type=\"unfinished\">集成并运行</translation>\n    </message>\n    <message>\n        <location line=\"+10\"/>\n        <source>Run once</source>\n        <translation type=\"unfinished\">运行一次</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+385\"/>\n        <source>Warning</source>\n        <translation>警告</translation>\n    </message>\n    <message>\n        <source>AppImage has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.</source>\n        <translation type=\"vanished\">AppImage 已集成，但它不在当前集成目标文件夹。\n\n你想要将它移至新位置吗？\n选择否将运行一次 AppImage ，并将 AppImage 留在当前文件夹。</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>AppImage %1 has already been integrated, but it is not in the current integration destination directory.\n\nDo you want to move it into the new destination?\n\nChoosing No will run the AppImage once, and leave the AppImage in its current directory.\n\n</source>\n        <translation>AppImage %1 已集成，但它不在当前已集成的文件夹内。\n\n你想要将它移至新位置吗？\n\n选择否将运行一次 AppImage ，并将 AppImage 留在当前文件夹。\n\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"+1232\"/>\n        <location line=\"+8\"/>\n        <source>Error</source>\n        <translation>错误</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"+23\"/>\n        <source>Failed to unregister AppImage before re-integrating it</source>\n        <translation>未能在重新集成 AppImage 前解除集成</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-485\"/>\n        <source>Could not parse desktop file translations:\nCould not open file for reading:\n\n%1</source>\n        <translation>无法解析桌面文件翻译：\n无法读取此文件：\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Could not parse desktop file translations:\nInvalid syntax:\n\n%1</source>\n        <translation>无法解析桌面文件翻译：\n无效语法：\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+409\"/>\n        <source>File %1 is owned by another user: %2</source>\n        <translation>文件 %1 的所有者是：%2</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Permissions problem</source>\n        <translation>权限问题</translation>\n    </message>\n    <message>\n        <location line=\"+52\"/>\n        <source>Failed to run permissions helper, exited with return code %1</source>\n        <translation>运行权限助手失败，退出代码 %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Could not find suitable permissions helper, aborting</source>\n        <translation>未找到合适的权限助手，正在退出</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location line=\"-985\"/>\n        <location line=\"+680\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+106\"/>\n        <location line=\"+12\"/>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+119\"/>\n        <location line=\"+42\"/>\n        <source>Error</source>\n        <translation>错误</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/main.cpp\" line=\"-362\"/>\n        <source>AppImageLauncher does not support type %1 AppImages at the moment.</source>\n        <translation>AppImageLauncher 目前不支持 %1 类型的 AppImage 。</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>Could not make AppImage executable: %1</source>\n        <translation>无法设置 AppImage 为可执行： %1</translation>\n    </message>\n    <message>\n        <source>Failed to open AppImage for reading: %1</source>\n        <translation type=\"vanished\">未能打开 AppImage 以读取： %1</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary directory</source>\n        <translation type=\"vanished\">未能创建临时文件夹</translation>\n    </message>\n    <message>\n        <source>Failed to create temporary copy of type 1 AppImage</source>\n        <translation type=\"vanished\">未能创建 %1 类型 AppImage 的临时副本</translation>\n    </message>\n    <message>\n        <source>Failed to open temporary AppImage copy for writing</source>\n        <translation type=\"vanished\">未能打开临时 AppImage 副本以写入</translation>\n    </message>\n    <message>\n        <source>Failed to remove magic bytes from temporary AppImage copy</source>\n        <translation type=\"vanished\">未能从临时AppImage 副本中移除 magic bytes</translation>\n    </message>\n    <message>\n        <source>execv() failed: %1</source>\n        <comment>error message</comment>\n        <translation type=\"vanished\">execv() 失败： %1</translation>\n    </message>\n    <message>\n        <source>runtime not found: no such file or directory: %1</source>\n        <translation type=\"vanished\">未找到运行时：无此文件或文件夹： %1</translation>\n    </message>\n    <message>\n        <location line=\"+40\"/>\n        <source>execv() failed: %1</source>\n        <translation>execv() 失败： %1</translation>\n    </message>\n    <message>\n        <location line=\"+70\"/>\n        <source>Usage: %1 [options] &lt;path&gt;</source>\n        <translation>用法： %1 [选项] &lt;路径&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Desktop integration helper for AppImages, for use by Linux distributions.</source>\n        <translation>AppImage 桌面集成助手，供 Linux 发行版使用。</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Options:</source>\n        <translation>选项：</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display this help and exit</source>\n        <translation>显示此帮助并退出</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Display version and exit</source>\n        <translation>显示版本并退出</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Arguments:</source>\n        <translation>参数：</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Path to AppImage (mandatory)</source>\n        <translation>AppImage 路径（强制）</translation>\n    </message>\n    <message>\n        <location line=\"+265\"/>\n        <source>Unexpected result from the integration dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location line=\"-287\"/>\n        <source>Failed to clean up old desktop files</source>\n        <translation>清除旧桌面文件失败</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: error while trying to start appimagelauncherfs.service</source>\n        <translation type=\"vanished\">在 AppImageLauncherFS 中注册 AppImage 失败：启动 appimagelauncherfs.service 时出错</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: failed to register AppImage path %1</source>\n        <translation type=\"vanished\">在 AppImageLauncherFSFailed 中注册 AppImage 失败：注册 AppImage 路径 %1 失败</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not open map file</source>\n        <translation type=\"vanished\">在 AppImageLauncherFSFailed 中注册 AppImage 失败：无法打开映射文件</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: could not find virtual file for AppImage</source>\n        <translation type=\"vanished\">在 AppImageLauncherFSFailed 中注册 AppImage 失败：无法找到 AppImage 虚拟文件</translation>\n    </message>\n    <message>\n        <source>Failed to register AppImage in AppImageLauncherFS: unknown failure</source>\n        <translation type=\"vanished\">在 AppImageLauncherFSFailed 中注册 AppImage 失败：未知失败</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"+1\"/>\n        <source>Failed to clean up AppImage trash bin: %1</source>\n        <translation>清空 AppImage 垃圾箱失败： %1</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Unknown AppImageLauncher option: %1</source>\n        <translation>未知 AppImageLauncher 选项： %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-74\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-99\"/>\n        <source>Error: no such file or directory: %1</source>\n        <translation>错误：无此文件或文件夹： %1</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"+7\"/>\n        <source>Not an AppImage: %1</source>\n        <translation>不是 AppImage： %1</translation>\n    </message>\n    <message>\n        <location line=\"+162\"/>\n        <source>The directory the integrated AppImages are stored in is currently set to:\n%1</source>\n        <translation>存储集成的 AppImage 的文件夹现在被设为：\n%1</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to: %1</source>\n        <translation type=\"vanished\">存储集成的 AppImage 的文件夹现在被设为： %1</translation>\n    </message>\n    <message>\n        <source>Integrating it will move the AppImage into a predefined location, and include it in your application launcher.</source>\n        <translation type=\"vanished\">集成它将会将 AppImage 移动到预设位置，并将它包含进你的应用启动器。</translation>\n    </message>\n    <message>\n        <source>To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher.</source>\n        <translation type=\"vanished\">请使用任务栏或启动器中应用图标的上下文菜单移除或更新 AppImage 。</translation>\n    </message>\n    <message>\n        <source>The directory the integrated AppImages are stored in is currently set to:</source>\n        <translation type=\"vanished\">存储集成的 AppImage 的文件夹现在被设为：</translation>\n    </message>\n    <message>\n        <source>%1 has not been integrated into your system.</source>\n        <translation type=\"vanished\">%1 尚未集成到你的系统。</translation>\n    </message>\n    <message>\n        <source>Desktop Integration</source>\n        <translation type=\"vanished\">桌面集成</translation>\n    </message>\n    <message>\n        <source>Integrate and run</source>\n        <translation type=\"vanished\">集成并运行</translation>\n    </message>\n    <message>\n        <source>Run once</source>\n        <translation type=\"vanished\">运行一次</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">取消</translation>\n    </message>\n    <message>\n        <source>Removes AppImages after desktop integration, for use by Linux distributions</source>\n        <translation type=\"vanished\">桌面集成后移除 AppImage ，供 Linux 发行版使用</translation>\n    </message>\n    <message>\n        <source>AppImageLauncher remove</source>\n        <comment>remove helper app name</comment>\n        <translation type=\"vanished\">AppImageLauncher 移除</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove_main.cpp\" line=\"-28\"/>\n        <source>Helper to delete integrated AppImages easily, e.g., from the application launcher&apos;s context menu</source>\n        <translation>用于轻松删除集成的 AppImage 的助手，例如，从应用启动器上下文菜单中删除</translation>\n    </message>\n    <message>\n        <location line=\"+19\"/>\n        <source>Path to AppImage</source>\n        <translation>AppImage 路径</translation>\n    </message>\n    <message>\n        <location line=\"+0\"/>\n        <source>&lt;path&gt;</source>\n        <translation>&lt;路径&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>AppImage delete helper error</source>\n        <translation>AppImage 删除助手错误</translation>\n    </message>\n    <message>\n        <source>AppImage remove helper error</source>\n        <translation type=\"vanished\">AppImage 移除助手错误</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Not an AppImage:\n\n%1</source>\n        <translation>不是 AppImage:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Refusing to work on non-integrated AppImage:\n\n%1</source>\n        <translation type=\"vanished\">拒绝在未集成 AppImage 上工作:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">请确认</translation>\n    </message>\n    <message>\n        <source>Are you sure you want to remove this AppImage?</source>\n        <translation type=\"vanished\">你确定要移除此 AppImage 吗？</translation>\n    </message>\n    <message>\n        <location line=\"+38\"/>\n        <source>Failed to unregister AppImage: %1</source>\n        <translation>未能注销 AppImage： %1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to move AppImage into trash bin directory</source>\n        <translation>将 AppImage 移入垃圾箱文件夹失败</translation>\n    </message>\n    <message>\n        <source>Failed to remove AppImage: %1</source>\n        <translation type=\"vanished\">移除 AppImage 失败： %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/shared/shared.cpp\" line=\"-27\"/>\n        <source>AppImage with same filename has already been integrated.</source>\n        <translation>具有相同文件名的 AppImage 已集成。</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you wish to overwrite the existing AppImage?</source>\n        <translation>你想要覆盖已存在的 AppImage 吗？</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Choosing No will run the AppImage once, and leave the system in its current state.</source>\n        <translation>选择否将运行一次 AppImage ，并保留当前系统状态。</translation>\n    </message>\n    <message>\n        <location line=\"-652\"/>\n        <location line=\"+656\"/>\n        <source>Warning</source>\n        <translation>警告</translation>\n    </message>\n    <message>\n        <source>Failed to move AppImage to target location</source>\n        <translation type=\"vanished\">未能将 AppImage 移动到目标位置</translation>\n    </message>\n    <message>\n        <location line=\"-296\"/>\n        <source>Failed to register AppImage in system via libappimage</source>\n        <translation>未能通过 libappimage 在系统中注册 AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to find integrated desktop file</source>\n        <translation>未找到已集成桌面文件</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Couldn&apos;t find integrated AppImage&apos;s desktop file</source>\n        <translation>无法找到已集成 AppImage 的桌面文件</translation>\n    </message>\n    <message>\n        <location line=\"+20\"/>\n        <source>Failed to load desktop file:</source>\n        <translation>加载桌面文件失败：</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>AppImage has invalid desktop file</source>\n        <translation>AppImage 有无效桌面文件</translation>\n    </message>\n    <message>\n        <location line=\"+271\"/>\n        <source>Failed to move AppImage to target location.\nTry to copy AppImage instead?</source>\n        <translation>未能移动 AppImage 到目标位置。\n改为尝试复制 AppImage 吗？</translation>\n    </message>\n    <message>\n        <location line=\"+181\"/>\n        <source>Failed to call stat() on path:\n\n%1</source>\n        <translation>在此路径上调用 stat() 失败:\n\n%1</translation>\n    </message>\n    <message>\n        <source>Failed to copy AppImage to target location</source>\n        <translation type=\"vanished\">未能复制 AppImage 到目标位置</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/update_main.cpp\" line=\"-40\"/>\n        <source>Updates AppImages after desktop integration, for use by Linux distributions</source>\n        <translation>桌面集成后更新 AppImage ，供 Linux 发行版使用</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>AppImageLauncher update</source>\n        <comment>update helper app name</comment>\n        <translation>AppImageLauncher 更新</translation>\n    </message>\n    <message>\n        <source>The AppImage hasn&apos;t been integrated before. This tool will, however, integrate the updated AppImage.</source>\n        <translation type=\"vanished\">AppImage 此前未集成。然而此工具将集成更新后的 AppImage 。</translation>\n    </message>\n    <message>\n        <source>Do you wish to continue?</source>\n        <translation type=\"vanished\">你想继续吗？</translation>\n    </message>\n    <message>\n        <location line=\"+67\"/>\n        <source>No updates found</source>\n        <translation>未找到更新</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find updates for AppImage %1</source>\n        <translation>无法找到 AppImage %1 的更新</translation>\n    </message>\n    <message>\n        <source>Failed to check for updates. Please check the command line output for details.</source>\n        <translation type=\"vanished\">检查更新失败。请检查命令行输出获取详细信息。</translation>\n    </message>\n    <message>\n        <location line=\"+7\"/>\n        <source>No update information found</source>\n        <translation>未找到更新信息</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set update information to allow for easy updating.</source>\n        <translation type=\"vanished\">AppImage 中未找到更新信息：\n%1\n\n此 AppImage 不支持更新。请要求作者创建更新信息以便轻松更新。</translation>\n    </message>\n    <message>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to set upupdate information to allow for easy updating.</source>\n        <translation type=\"vanished\">无法在 AppImage 中找到更新信息：\n%1\n\n此 AppImage 不支持更新。请向作者请求设置更新信息以允许轻松更新。</translation>\n    </message>\n    <message>\n        <location line=\"+1\"/>\n        <source>Could not find update information in AppImage:\n%1\n\nThe AppImage doesn&apos;t support updating. Please ask the authors to embed update information to allow for easy updating.</source>\n        <translation>无法获取Appimage内的升级信息。\n%1\n\n此Appimage不支持升级。为了轻松升级，请联系作者在Appimage内添加升级信息。</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>Failed to check for updates:\n\n%1</source>\n        <translation>检查更新失败：\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+12\"/>\n        <source>An update has been found for the AppImage %1</source>\n        <translation>已发现 AppImage %1 的一个更新</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>Do you want to perform the update?</source>\n        <translation>你想要执行更新吗？</translation>\n    </message>\n    <message>\n        <location line=\"+4\"/>\n        <source>Remove old AppImage after successful update</source>\n        <translation>更新成功后移除旧 AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+24\"/>\n        <source>Failed to update AppImage:\n\n%1</source>\n        <translation>更新 AppImage 失败：\n\n%1</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>File reported as updated does not exist: %1</source>\n        <translation>报告为已更新的文件不存在： %1</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Failed to register updated AppImage in system</source>\n        <translation>未能在系统中注册已更新 AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>Failed to unregister old AppImage in system</source>\n        <translation>未能在系统中注销旧 AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>Failed to remove old AppImage</source>\n        <translation>移除旧 AppImage 失败</translation>\n    </message>\n    <message>\n        <location filename=\"../src/daemon/main.cpp\" line=\"+101\"/>\n        <source>Tracks AppImages in applications directories (user&apos;s, system and other ones). Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.</source>\n        <translation>在应用程序文件夹（用户，系统和其他目录）中跟踪 AppImage。 自动集成移动到这些文件夹中的 AppImage，并取消集成从其中删除的 AppImage。</translation>\n    </message>\n    <message>\n        <location line=\"+8\"/>\n        <source>Lists directories watched by this daemon and exit</source>\n        <translation>列出此守护程序监视的文件夹并退出</translation>\n    </message>\n</context>\n<context>\n    <name>RemoveDialog</name>\n    <message>\n        <source>Please confirm</source>\n        <translation type=\"vanished\">请确认</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to remove this AppImage?&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;您确定要移除此 AppImage 吗？&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/remove.ui\" line=\"+17\"/>\n        <source>Delete AppImage</source>\n        <translation>删除 AppImage</translation>\n    </message>\n    <message>\n        <location line=\"+14\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;您确定要删除此 AppImage 吗?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+22\"/>\n        <source>%1</source>\n        <translation>%1</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Uncheck to only remove the desktop integration, but leave the file on the system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"vanished\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;取消勾选则仅删除桌面集成，但将文件保留在系统上。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Remove AppImage file from system</source>\n        <translation type=\"vanished\">从系统中移除 AppImage 文件</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.ui\" line=\"+14\"/>\n        <source>AppImageLauncher Settings</source>\n        <translation>AppImageLauncher 设置</translation>\n    </message>\n    <message>\n        <location line=\"+16\"/>\n        <source>Launcher Dialog</source>\n        <translation>启动器对话框</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>Ask whether to move AppImage files into the applications directory</source>\n        <translation>询问是否将 AppImage 文件移动到应用程序文件夹中</translation>\n    </message>\n    <message>\n        <location line=\"+119\"/>\n        <source>General settings</source>\n        <translation>通用设置</translation>\n    </message>\n    <message>\n        <location line=\"+6\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;选中此框后，AppImageLauncher 会自动启动一个名为 appimagelauncherd 的守护程序。&lt;/p&gt;&lt;p&gt;此守护程序自动集成复制到 &amp;quot;Applications 文件夹&amp;quot;及其它您配置的文件夹中的 AppImage。删除文件后，守护程序将清除集成数据。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location line=\"+3\"/>\n        <source>Auto start auto-integration daemon</source>\n        <translation>自动启动自动集成守护程序</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Additional directories to watch</source>\n        <translation>要监视的其文件夹</translation>\n    </message>\n    <message>\n        <location line=\"+11\"/>\n        <source>Add new directory to list</source>\n        <translation>向列表中添加新的文件夹</translation>\n    </message>\n    <message>\n        <location line=\"+13\"/>\n        <source>Remove selected directory from list</source>\n        <translation>从列表中删除选定的文件夹</translation>\n    </message>\n    <message>\n        <location line=\"-144\"/>\n        <source>Applications directory path</source>\n        <translation>应用程序文件夹路径</translation>\n    </message>\n    <message>\n        <location line=\"-11\"/>\n        <source>Location where to store your AppImage files to ease their management</source>\n        <translation>存储 AppImage 文件以简化其管理的位置</translation>\n    </message>\n    <message>\n        <location line=\"+49\"/>\n        <source>Available Features</source>\n        <translation>可用功能</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/settings_dialog.cpp\" line=\"+40\"/>\n        <source>updater available for AppImages supporting AppImageUpdate</source>\n        <translation>可用于支持 AppImageUpdate 的 AppImage 的更新程序</translation>\n    </message>\n    <message>\n        <location line=\"+2\"/>\n        <source>updater unavailable</source>\n        <translation>有可用更新</translation>\n    </message>\n    <message>\n        <location line=\"+5\"/>\n        <source>&lt;strong&gt;Note: this is an AppImageLauncher Lite build, only supports a limited set of features&lt;/strong&gt;&lt;br /&gt;Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience</source>\n        <translation>&lt;strong&gt;注意：这是一个 AppImageLauncher Lite 版本，仅支持有限的功能集&lt;/strong&gt;&lt;br /&gt;请通过提供的原生软件包安装完整版，以享受完整的 AppImageLauncher 体验</translation>\n    </message>\n    <message>\n        <location line=\"+137\"/>\n        <source>Select Applications directory</source>\n        <translation>选择应用程序文件夹</translation>\n    </message>\n    <message>\n        <location line=\"+17\"/>\n        <source>Select additional directory to watch</source>\n        <translation>选择监视的其他文件夹</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "resources/AppImageLauncher.1.in",
    "content": ".\\\" Manpage for AppImageLauncher.\n.\\\" Contact theassassin@assassinate-you.net to correct errors or typos.\n.TH man 1 \"28 February 2019\" \"@APPIMAGELAUNCHER_VERSION@\" \"AppImageLauncher man page\"\n.SH NAME\nAppImageLauncher \\- Desktop integration helper for AppImages, for use by Linux distributions.\n.SH SYNOPSIS\nAppImageLauncher [PATH]\n.SH DESCRIPTION\nHelper application for Linux distributions serving as a\nkind of \"entry point\" for running and integrating AppImages.\n\nAppImage provides a way for upstream developers to provide\n“native” binaries for Linux users just the same way they could\ndo for other operating systems. It allows for packaging applications\nfor any common Linux based operating system, e.g., Debian.\nAppImages come with all dependencies that cannot be assumed\nto be part of each target system in a recent enough version and\nwill run on most Linux distributions without further modifications.\n\nAppImageLauncher makes your Linux desktop AppImage ready™.\nYou can integrate AppImages with a single mouse click, and manage\nthem from your application launcher. Install AppImageLauncher today\nfor your distribution and enjoy using AppImages as easy as never before!\n.SH OPTIONS\n.IP --appimagelauncher-help\nDisplay this help and exit\n.IP --appimagelauncher-version\nDisplay version and exit\n.SH ARGUMENTS\nPath to AppImage (mandatory)\n.SH BUGS\nNo known bugs.\n.SH AUTHOR\nTheAssassin <theassassin@assassinate-you.net>\n\n"
  },
  {
    "path": "resources/CMakeLists.txt",
    "content": "# install configs for resource files\n\n# we depend on GNUInstallDirs, so let's make sure it's been loaded\ninclude(GNUInstallDirs)\n\n# debugging: should be share\nmessage(STATUS \"CMAKE_INSTALL_DATADIR: ${CMAKE_INSTALL_DATADIR}\")\n\ninstall(\n    DIRECTORY\n    ${CMAKE_CURRENT_SOURCE_DIR}/mime\n    DESTINATION ${CMAKE_INSTALL_DATADIR} COMPONENT APPIMAGELAUNCHER\n)\n\ninstall(\n    DIRECTORY\n    ${CMAKE_CURRENT_SOURCE_DIR}/icons/hicolor\n    DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/ COMPONENT APPIMAGELAUNCHER\n)\n\ninstall(\n    FILES\n    ${CMAKE_CURRENT_SOURCE_DIR}/appimagelauncher.desktop\n    ${CMAKE_CURRENT_SOURCE_DIR}/appimagelaunchersettings.desktop\n    ${CMAKE_CURRENT_SOURCE_DIR}/appimagelauncherd.desktop\n    ${CMAKE_CURRENT_SOURCE_DIR}/ail-cli.desktop\n    DESTINATION ${CMAKE_INSTALL_DATADIR}/applications COMPONENT APPIMAGELAUNCHER\n)\n\ninstall(\n    DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/fallback-icons\n    DESTINATION ${CMAKE_INSTALL_DATADIR}/appimagelauncher COMPONENT APPIMAGELAUNCHER\n)\n# we also need to copy the files into the binary dir to make their path predictable relative to the binary's location\nfile(\n    COPY \"${CMAKE_CURRENT_SOURCE_DIR}/fallback-icons\"\n    DESTINATION \"${CMAKE_CURRENT_BINARY_DIR}\"\n)\n\nset(INSTALL_MAINTAINER_SCRIPTS OFF CACHE BOOL \"\")\n\n# install maintainer scripts that distro packagers might find useful\nif (INSTALL_MAINTAINER_SCRIPTS)\n    message(STATUS \"Installing maintainer scripts\")\n\n    set(install_maintainer_scripts_dir ${PROJECT_BINARY_DIR}/cmake/install-maintainer-scripts/)\n\n    configure_file(\n        ${PROJECT_SOURCE_DIR}/resources/install-scripts/post-install.in\n        ${install_maintainer_scripts_dir}/post-install\n        @ONLY\n    )\n    configure_file(\n        ${PROJECT_SOURCE_DIR}/resources/install-scripts/post-uninstall.in\n        ${install_maintainer_scripts_dir}/post-uninstall\n        @ONLY\n    )\n\n    install(\n        FILES ${install_maintainer_scripts_dir}/post-install ${install_maintainer_scripts_dir}/post-uninstall\n        DESTINATION ${CMAKE_INSTALL_DATADIR}/appimagelauncher/maintainer-scripts\n    )\nendif()\n\n\n# install man page\nset(INSTALL_MAN_PAGE ON CACHE BOOL \"\")\n\nif(INSTALL_MAN_PAGE)\n    set(configured_man_page_path ${PROJECT_BINARY_DIR}/cmake/man/AppImageLauncher.1)\n\n    configure_file(\n        ${PROJECT_SOURCE_DIR}/resources/AppImageLauncher.1.in\n        ${configured_man_page_path}\n    )\n\n    install(\n        FILES ${configured_man_page_path}\n        DESTINATION share/man/man1 COMPONENT APPIMAGELAUNCHER\n    )\nendif()\n"
  },
  {
    "path": "resources/ail-cli.desktop",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nExec=ail-cli\nName=AppImageLauncher CLI\nIcon=AppImageLauncher\nTerminal=false\nCategories=Utility;\nNoDisplay=true\nX-AppImage-Integrate=false\nStartupWMClass=AppImageLauncher\n"
  },
  {
    "path": "resources/appimagelauncher-lite-AppRun.sh",
    "content": "#! /bin/bash\n\nset -e\n\nif [[ \"$VERBOSE\" != \"\" ]]; then\n    set -x\nfi\n\n# shift does not work if no arguments have been passed, therefore we just handle that situation right now\nif [[ \"$1\" == \"\" ]]; then\n    echo \"Error: no option passed, use --help for more information\"\n    exit 2\nfi\n\nfirstarg=\"$1\"\nshift\n\n# ensure this important variable is available, as most operations (except for install) can be done without being run\n# from via AppImage runtime (e.g., while the AppImage is extracted, which is great for testing)\nexport APPDIR=${APPDIR:-$(readlink -f $(dirname \"$0\"))}\n\n# import common script code\nsource \"$APPDIR\"/appimagelauncher-lite-installer-common.sh\n\nprint_help() {\n    echo \"Usage: $0 <option> ...\"\n    echo\n    echo \"Main options:\"\n    echo \"  install       Install AppImageLauncher into your user account\"\n    echo \"  uninstall     Uninstall AppImageLauncher from your user account\"\n    echo \"  help|--help   Display this help\"\n    echo\n    echo \"Other options (mainly for use by AppImageLauncher Lite internally):\"\n    echo \"  appimagelauncherd          Run appimagelauncherd\"\n    echo \"  AppImageLauncherSettings   Display AppImageLauncher Lite configuration utility\"\n    echo \"  cli [or ali-cli]           Run AppImageLauncher cli (use \\\"cli --help\\\" for more information)\"\n    echo \"  remove <path>              Run removal helper to remove AppImage <path>\"\n    echo \"  update <path>              Run update helper to update AppImage <path>\"\n}\n\ncase \"$firstarg\" in\n    help|--help)\n        print_help\n        exit 0\n        ;;\n    appimagelauncherd|AppImageLauncherSettings)\n        exec \"$APPDIR\"/usr/bin/\"$firstarg\" \"$@\"\n        ;;\n    cli|ail-cli)\n        exec \"$APPDIR\"/usr/bin/ail-cli \"$@\"\n        ;;\n    remove|update)\n        #exec \"$APPDIR\"/usr/lib/**/appimagelauncher/\"$firstarg\" \"$@\"\n        exec \"$APPDIR\"/usr/bin/\"$firstarg\" \"$@\"\n        ;;\n    install)\n        if test_globally_installed; then\n            echo \"Error: AppImageLauncher is installed system-wide already, not installing on top\" 1>&2\n            exit 2\n        fi\n\n        if test_root_user; then\n            tput setaf 1\n            tput bold\n            cat <<EOF\n##################################################################\n#                                                                #\n#   ██╗    ██╗ █████╗ ██████╗ ███╗   ██╗██╗███╗   ██╗ ██████╗    #\n#   ██║    ██║██╔══██╗██╔══██╗████╗  ██║██║████╗  ██║██╔════╝    #\n#   ██║ █╗ ██║███████║██████╔╝██╔██╗ ██║██║██╔██╗ ██║██║  ███╗   #\n#   ██║███╗██║██╔══██║██╔══██╗██║╚██╗██║██║██║╚██╗██║██║   ██║   #\n#   ╚███╔███╔╝██║  ██║██║  ██║██║ ╚████║██║██║ ╚████║╚██████╔╝   #\n#    ╚══╝╚══╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═══╝╚═╝╚═╝  ╚═══╝ ╚═════╝    #\n#                                                                #\n##################################################################\nEOF\n            tput sgr0\n\n            echo\n            echo \"Installation as root is **not** supported or recommended!\"\n            echo \"The installation routine is designed only for regular users.\"\n            echo \"If you run this with e.g., sudo, please re-run without, root permissions\"\n            echo \"are not required by this installer.\"\n            echo\n            read -p \"Continue at your own risk? [yN] \" -n1 -r\n            echo\n\n            case \"$REPLY\" in\n                y|Y)\n                    echo \"Continuing installation as per user's request\"\n                    ;;\n                *)\n                    return 1\n                    ;;\n            esac\n        fi\n\n        if test_installed_already; then\n            echo \"Error: AppImageLauncher Lite is installed already, please uninstall before trying to reinstall\" 1>&2\n            exit 2\n        fi\n\n        echo \"Installing AppImageLauncher Lite\"\n        ail_lite_install\n        ;;\n    uninstall)\n        if ! test_installed_already; then\n            echo \"Error: AppImageLauncher Lite does not seem to be installed\" 1>&2\n            exit 2\n        fi\n\n        echo \"Uninstalling AppImageLauncher Lite\"\n        ail_lite_uninstall\n        ;;\n    *)\n        echo \"Unknown operation: $firstarg\";\n        exit 2\n        ;;\nesac\n\n\n\n"
  },
  {
    "path": "resources/appimagelauncher-lite-installer-common.sh",
    "content": "prefix=\"appimagelauncher-lite\"\ninstall_dir=~/.local/lib/appimagelauncher-lite\ninstalled_appimage_path=\"$install_dir\"/appimagelauncher-lite.AppImage\nsettings_desktop_file_path=~/.local/share/applications/\"$prefix\"-AppImageLauncherSettings.desktop\nsystemd_user_units_dir=~/.config/systemd/user/\nappimagelauncherd_systemd_service_name=appimagelauncherd.service\nintegrated_icon_path=~/.local/share/icons/hicolor/scalable/apps/AppImageLauncher-Lite.svg\nno_desktop_integration_marker_path=~/.local/share/appimagekit/no_desktopintegration\n\ntest_globally_installed() {\n    which AppImageLauncher &>/dev/null && return 0\n    type AppImageLauncher &>/dev/null && return 0\n\n    # SC2144 -d doesn't work with globs, using a loop therefore\n    for i in /usr/lib/*/appimagelauncher; do\n        if [[ -d \"$i\" ]]; then\n            return 0\n        fi\n    done\n\n    return 1\n}\n\ntest_installed_already() {\n    [[ -d \"$install_dir\" ]] && return 0\n\n    return 1\n}\n\ntest_root_user() {\n    [[ \"$(id -u)\" -eq 0 ]]\n}\n\nail_lite_notify_desktop_integration() {\n    update-desktop-database ~/.local/share/applications\n    gtk-update-icon-cache\n}\n\nail_lite_install() {\n    if [[ \"$APPIMAGE\" == \"\" ]]; then\n        echo \"Error: not running from AppImage, aborting\"\n        return 2\n    fi\n\n    # create default Applications directory\n    mkdir -p ~/Applications\n\n    # prepare install dir\n    mkdir -p \"$install_dir\"\n    mkdir -p \"$install_dir\"/systemd\n\n    # copy ourselves to install dir\n    install -D \"$APPIMAGE\" \"$installed_appimage_path\"\n\n    # set up appimagelauncherd\n    cat > \"$install_dir\"/systemd/\"$appimagelauncherd_systemd_service_name\" <<EOF\n[Unit]\nDescription=AppImageLauncher daemon\n\n[Service]\nExecStart=${installed_appimage_path} appimagelauncherd\nRestart=on-failure\nRestartSec=10\n\n[Install]\nWantedBy=default.target\nEOF\n\n    # now we need to make systemd aware of your service file\n    mkdir -p \"$systemd_user_units_dir\"\n    ln -s \"$install_dir\"/systemd/\"$appimagelauncherd_systemd_service_name\" \"$systemd_user_units_dir\"/\n\n    systemctl --user daemon-reload\n    systemctl --user enable \"$appimagelauncherd_systemd_service_name\"\n    systemctl --user restart \"$appimagelauncherd_systemd_service_name\"\n\n    # set up desktop file for AppImageLauncherSettings\n    install -d $(dirname \"$settings_desktop_file_path\")\n    cat > \"$settings_desktop_file_path\" <<EOF\n[Desktop Entry]\nVersion=1.0\nType=Application\nExec=${installed_appimage_path} AppImageLauncherSettings %f\nName=AppImageLauncher Settings\nIcon=AppImageLauncher-Lite\nTerminal=false\nCategories=Settings;\nX-AppImage-Integrate=false\nStartupWMClass=AppImageLauncherSettings\nEOF\n\n    # copy icon for AppImageLauncherSettings\n    # TODO: copy PNG icons, too\n    install -D \"$APPDIR\"/usr/share/icons/hicolor/scalable/apps/AppImageLauncher.svg \"$integrated_icon_path\"\n\n    # notify desktop of changes\n    ail_lite_notify_desktop_integration\n\n    # Suppress desktop integration scripts in AppImages\n    mkdir -p $(dirname \"$no_desktop_integration_marker_path\")\n    touch \"$no_desktop_integration_marker_path\"\n\n    echo \"AppImageLauncher Lite has been installed successfully.\"\n    return 0\n}\n\nail_lite_uninstall() {\n    # remove appimagelauncherd systemd stuff\n    systemctl --user stop \"$appimagelauncherd_systemd_service_name\"\n    systemctl --user disable \"$appimagelauncherd_systemd_service_name\"\n    systemctl --user daemon-reload\n\n    # remove all the installed files\n    rm -r \"$install_dir\"\n\n    # remove desktop integration of several tools\n    rm \"$settings_desktop_file_path\"\n    rm \"$integrated_icon_path\"\n    ail_lite_notify_desktop_integration\n\n    # Attempt to remove desktop integration scripts in AppImages suppression\n    [[ -f \"$no_desktop_integration_marker_path\" ]] && rm \"$no_desktop_integration_marker_path\"\n    [[ -d $(dirname \"$no_desktop_integration_marker_path\") ]] && rmdir $(dirname \"$no_desktop_integration_marker_path\")\n\n    echo \"AppImageLauncher Lite has been uninstalled successfully.\"\n    return 0\n}\n"
  },
  {
    "path": "resources/appimagelauncher-lite.desktop",
    "content": "[Desktop Entry]\nName=appimagelauncher-lite\nExec=appimagelauncher-lite\nIcon=AppImageLauncher\nType=Application\nX-AppImage-Integrate=false\nNoDisplay=true\nCategories=Utility;\n"
  },
  {
    "path": "resources/appimagelauncher.desktop",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nExec=AppImageLauncher %f\nName=AppImageLauncher\nIcon=AppImageLauncher\nTerminal=false\nCategories=Utility;\nMimeType=application/x-iso9660-appimage;application/x-appimage;application/vnd.appimage;\nNoDisplay=true\nX-AppImage-Integrate=false\nStartupWMClass=AppImageLauncher\n"
  },
  {
    "path": "resources/appimagelauncherd.desktop",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nExec=appimagelauncherd\nName=appimagelauncherd\nIcon=appimagelauncherd\nTerminal=true\nCategories=Utility;\nNoDisplay=true\nX-AppImage-Integrate=false\n"
  },
  {
    "path": "resources/appimagelauncherd.service.in",
    "content": "[Unit]\nDescription=AppImageLauncher daemon\n\n[Service]\nExecStart=@CMAKE_INSTALL_PREFIX@/bin/appimagelauncherd\nRestart=on-failure\nRestartSec=10\n\n[Install]\nWantedBy=default.target\n"
  },
  {
    "path": "resources/appimagelaunchersettings.desktop",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nExec=AppImageLauncherSettings %f\nName=AppImageLauncher Settings\nName[de]=AppImageLauncher-Einstellungen\nName[it]=Impostazioni di AppImageLauncher\nComment=Change settings for AppImageLauncher\nComment[de]=Einstellungen für AppImageLauncher ändern\nComment[it]=Cambia le impostazioni di AppImageLauncher\nIcon=AppImageLauncher\nTerminal=false\nCategories=Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-PersonalSettings;X-GNOME-PersonalSettings;\nX-AppImage-Integrate=false\nStartupWMClass=AppImageLauncher\n"
  },
  {
    "path": "resources/binfmt.d/appimagelauncher.conf.in",
    "content": "# Launch AppImages with AppImageLauncher\n# we use the F (fix binary) mode to make sure the interpreter is available in all namespaces/cgroups/changerooots\n# without having to have the binary in a specific place\n:appimage-type1:M:8:AI\\x01::@BINFMT_INTERPRETER_PATH@:F\n:appimage-type2:M:8:AI\\x02::@BINFMT_INTERPRETER_PATH@:F\n"
  },
  {
    "path": "resources/fallback-icons/.gitignore",
    "content": "inkscape/\n"
  },
  {
    "path": "resources/icons/generate-icons.sh",
    "content": "#! /bin/bash\n\nset -e\n\nif ! (which inkscape &>/dev/null); then\n    echo \"Error: this tool requires inkscape\" >&2\n    exit 1\nfi\n\ncd $(dirname \"$0\")\n\nin_file=$(readlink -f $(dirname \"$0\"))/appimagelauncher.inkscape.svg\n\n# create directory structure\nmkdir -p hicolor/scalable/apps\ninkscape --export-plain-svg=hicolor/scalable/apps/AppImageLauncher.svg \"$in_file\"\n\nfor res in 16 32 64 128 160 192 256 384 512; do\n    fullres=\"${res}x${res}\"\n    echo \"Generating PNG for resolution $fullres\"\n\n    mkdir -p hicolor/\"$fullres\"/apps\n\n    inkscape -w \"$res\" -h \"$res\" -e hicolor/\"$fullres\"/apps/AppImageLauncher.png \"$in_file\"\n#    rsvg-convert -w \"$res\" -h \"$res\" \"$in_file\" > hicolor/\"$fullres\"/apps/AppImageLauncher.png\ndone\n"
  },
  {
    "path": "resources/install-scripts/post-install.in",
    "content": "#! /bin/bash\n\nset -euo pipefail\n\necho \"Installing AppImageLauncher as interpreter for AppImages\"\n\n# as there's no _real_ package that we could use as a dependency to take care of the kernel module,\n# we need to make sure that the kernel module is loaded manually\nif which modprobe &> /dev/null; then\n    if ! modprobe -v binfmt_misc; then\n        echo \"modprobe failed, binfmt_misc might be unavailable\"\n    fi\nelse\n    echo \"modprobe not found, cannot enable binfmt_misc, skipping\"\nfi\n\n(set -x; systemctl restart systemd-binfmt)\n"
  },
  {
    "path": "resources/install-scripts/post-uninstall.in",
    "content": "#! /bin/bash\n\nset -euo pipefail\n\necho \"Removing AppImageLauncher as interpreter for AppImages\"\n(set -x; systemctl restart systemd-binfmt)\n\nupdate_notifier=\"/usr/share/update-notifier/notify-reboot-required\"\nif [ -x \"$update_notifier\" ]; then\n    \"$update_notifier\"\nfi\n\ncat <<EOF\n#####################################################\n#                                                   #\n#  NOTE: you need to reboot your computer in order  #\n#  to complete the uninstallation                   #\n#                                                   #\n#  (If you see this message during an upgrade:      #\n#  don't worry, you do not have to take any         #\n#  action, no reboot required!)                     #\n#                                                   #\n#####################################################\nEOF\n"
  },
  {
    "path": "resources/mime/packages/appimage.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">\n\n  <mime-type type=\"application/x-iso9660-appimage\">\n    <_comment>AppImage application bundle (Type 1)</_comment>\n    <sub-class-of type=\"application/x-executable\"/>\n    <sub-class-of type=\"application/x-iso9660-image\"/>\n    <generic-icon name=\"application-x-executable\"/>\n    <magic priority=\"100\">\n      <match value=\"ELF\" type=\"string\" offset=\"1\" >\n        <match value=\"0x41\" type=\"byte\" offset=\"8\">\n          <match value=\"0x49\" type=\"byte\" offset=\"9\">\n            <match value=\"0x01\" type=\"byte\" offset=\"10\"/>\n          </match>\n        </match>\n      </match>\n    </magic>\n    <glob pattern=\"*.appimage\"/>\n    <glob pattern=\"*.AppImage\"/>\n  </mime-type>\n\n  <mime-type type=\"application/vnd.appimage\">\n    <_comment>AppImage application bundle (Type 2)</_comment>\n    <sub-class-of type=\"application/x-executable\"/>\n    <sub-class-of type=\"application/vnd.squashfs\"/>\n    <generic-icon name=\"application-x-executable\"/>\n    <magic priority=\"100\">\n      <match value=\"ELF\" type=\"string\" offset=\"1\" >\n        <match value=\"0x41\" type=\"byte\" offset=\"8\">\n          <match value=\"0x49\" type=\"byte\" offset=\"9\">\n            <match value=\"0x02\" type=\"byte\" offset=\"10\"/>\n          </match>\n        </match>\n      </match>\n    </magic>\n    <glob pattern=\"*.appimage\"/>\n    <glob pattern=\"*.AppImage\"/>\n  </mime-type>\n\n</mime-info>\n"
  },
  {
    "path": "src/CMakeLists.txt",
    "content": "# in version 3.6 IMPORTED_TARGET has been added to pkg_*_modules\ncmake_minimum_required(VERSION 3.10)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\nset(CMAKE_C_STANDARD 11)\nset(CMAKE_C_STANDARD_REQUIRED ON)\n\n# Find includes in corresponding build directories\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\n# Instruct CMake to run moc automatically when needed\nset(CMAKE_AUTOMOC ON)\n# Create code from a list of Qt designer ui files\nset(CMAKE_AUTOUIC ON)\n# Compile resource files\nset(CMAKE_AUTORCC ON)\n\nfind_package(Qt5 REQUIRED COMPONENTS Core Widgets DBus Quick QuickWidgets Qml)\n\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(glib REQUIRED glib-2.0>=2.40 IMPORTED_TARGET)\n\nfind_package(INotify REQUIRED)\n\n# disable Qt debug messages except for debug builds\nif (NOT CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n    message(STATUS \"CMake build type is ${CMAKE_BUILD_TYPE}, hence disabling debug messages in AppImageLauncher\")\n    add_definitions(-DQT_NO_DEBUG_OUTPUT)\n    add_definitions(-DQT_NO_INFO_OUTPUT)\n    add_definitions(-DQT_NO_WARNING_OUTPUT)\nendif()\n\n# this shall propagate to all targets built in the subdirs\nif(ENABLE_UPDATE_HELPER)\n    add_definitions(-DENABLE_UPDATE_HELPER)\nendif()\n\nadd_compile_options(-Wall -Wpedantic)\n\nif(BUILD_LITE)\n    add_definitions(-DBUILD_LITE)\nendif()\n\n# utility libraries\nadd_subdirectory(fswatcher)\nadd_subdirectory(i18n)\nadd_subdirectory(trashbin)\nadd_subdirectory(shared)\n\n# appimagelauncherd\nadd_subdirectory(daemon)\n\n# main application and helper tools\nadd_subdirectory(ui)\n\n# no need to include bypass launcher in lite builds\nif(NOT BUILD_LITE)\n    add_subdirectory(binfmt-bypass)\nendif()\n\n# CLI helper allowing other tools to utilize AppImageLauncher's code for e.g., integrating AppImages\nadd_subdirectory(cli)\n"
  },
  {
    "path": "src/binfmt-bypass/CMakeLists.txt",
    "content": "# needed for LINK_OPTIONS/target_link_options\ncmake_minimum_required(VERSION 3.13)\n\nproject(appimage-binfmt-bypass)\n\n# configure names globally\nset(bypass_bin binfmt-bypass)\nset(binfmt_interpreter binfmt-interpreter)\nset(bypass_lib lib${bypass_bin})\nset(preload_lib ${bypass_bin}-preload)\n# we're not using \"i386\" or \"armhf\" but instead the more generic \"32bit\" suffix, making things a little easier in the\n# code\nset(preload_lib_32bit ${preload_lib}_32bit)\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR})\n\nstring(TOLOWER ${CMAKE_C_COMPILER_ID} lower_cmake_c_compiler_id)\n\n# on 64-bit systems such as x86_64 or aarch64/arm64v8, we need to provide a 32-bit preload library to allow the users\n# to execute compatible 32-bit binaries, as the regular preload library cannot be preloaded due to the architecture\n# being incompatible\n# unfortunately, compiling on ARM is significantly harder than just adding a compiler flag, as gcc-multilib is missing\n# it's likely easier with clang, but that remains to be verified\nif(CMAKE_SYSTEM_PROCESSOR MATCHES x86_64)\n    message(STATUS \"64-bit target detected (${CMAKE_SYSTEM_PROCESSOR}), building 32-bit preload library as well\")\n    set(build_32bit_preload_library true)\nelseif(CMAKE_SYSTEM_PROCESSOR MATCHES arm64 OR CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)\n    string(TOLOWER ${CMAKE_C_COMPILER_ID} lower_cmake_c_compiler_id)\n\n    if(lower_cmake_c_compiler_id MATCHES clang)\n        # clang-3.8, the default clang on xenial, doesn't like the templates in elf.cpp with the varying return types\n        if(NOT ${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 3.9.0)\n            message(FATAL_ERROR \"clang too old, please upgrade to, e.g., clang-8\")\n        endif()\n\n        message(STATUS \"64-bit target detected (${CMAKE_SYSTEM_PROCESSOR}), building 32-bit preload library as well\")\n        set(build_32bit_preload_library true)\n    else()\n        message(WARNING \"64-bit target detected (${CMAKE_SYSTEM_PROCESSOR}), but compiling with ${lower_cmake_c_compiler_id}, cannot build 32-bit preload library\")\n    endif()\nendif()\n\nfunction(make_preload_lib_target target_name)\n    # library to be preloaded when launching the patched runtime binary\n    # we need to build with -fPIC, otherwise we can't use it with $LD_PRELOAD\n    add_library(${target_name} SHARED preload.c logging.h)\n    target_link_libraries(${target_name} PRIVATE dl)\n    target_compile_options(${target_name}\n        PRIVATE -fPIC\n        PRIVATE -DCOMPONENT_NAME=\"preload\"\n        # hide all symbols by default\n        PRIVATE -fvisibility=hidden\n    )\n    # compatibility with CMake < 3.13\n    set_target_properties(${target_name} PROPERTIES LINK_OPTIONS\n        # hide all symbols by default\n        -fvisibility=hidden\n    )\n\n    # a bit of a hack, but it seems to make binfmt bypass work in really old Docker images (e.g., CentOS <= 7)\n    add_custom_command(\n        TARGET ${target_name}\n        POST_BUILD\n        COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/fix-preload-library.sh $<TARGET_FILE_NAME:${target_name}>\n        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n        VERBATIM\n    )\nendfunction()\n\nmake_preload_lib_target(${preload_lib})\n\nif(build_32bit_preload_library)\n    make_preload_lib_target(${preload_lib_32bit})\n\n    if(CMAKE_SYSTEM_PROCESSOR MATCHES x86_64)\n        if(lower_cmake_c_compiler_id MATCHES clang)\n            target_compile_options(${preload_lib_32bit} PRIVATE \"--target=i386-linux-gnu\")\n            target_link_options(${preload_lib_32bit} PRIVATE \"--target=i386-linux-gnu\")\n        else()\n            # GCC style flags\n            target_compile_options(${preload_lib_32bit} PRIVATE \"-m32\")\n            target_link_options(${preload_lib_32bit} PRIVATE \"-m32\")\n        endif()\n    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES arm64 OR CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)\n        target_compile_options(${preload_lib_32bit} PRIVATE \"--target=arm-linux-gnueabihf\")\n        target_link_options(${preload_lib_32bit} PRIVATE \"--target=arm-linux-gnueabihf\")\n    else()\n        message(FATAL_ERROR \"unknown processor architecture: ${CMAKE_SYSTEM_PROCESSOR}\")\n    endif()\nendif()\n\n# we need to make the library below fully self-contained so that it works in other cgroups (e.g., in Docker containers)\n# out of the box\n# this allows us to check whether the path is available, and otherwise create a temporary file and use that then\n# this is a workaround to existing issues using AppImages in Docker with AppImageLauncher installed on the host system\ncheck_program(NAME xxd)\n\nfunction(generate_preload_lib_header target_name)\n    add_custom_command(\n        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.h\n        COMMAND xxd -i $<TARGET_FILE_NAME:${target_name}> ${target_name}.h\n        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n        DEPENDS ${target_name}\n        VERBATIM\n    )\nendfunction()\n\ngenerate_preload_lib_header(${preload_lib})\n\n# same story for 32-bit lib\nif (build_32bit_preload_library)\n    generate_preload_lib_header(${preload_lib_32bit})\nendif()\n\n# the lib provides an algorithm to extract the runtime, patch it and launch it, preloading our preload lib to make the\n# AppImage think it is launched normally\n# static linking is preferred, since we do not want to deal with an installed .so file, rpaths etc.\nadd_library(${bypass_lib} STATIC lib.cpp elf.cpp logging.h elf.h ${CMAKE_CURRENT_BINARY_DIR}/${preload_lib}.h)\ntarget_link_libraries(${bypass_lib} PUBLIC dl)\n# we need to include the preload lib headers (see below) from the binary dir\ntarget_include_directories(${bypass_lib} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})\ntarget_compile_options(${bypass_lib}\n    PRIVATE -DPRELOAD_LIB_NAME=\"$<TARGET_FILE_NAME:${preload_lib}>\"\n    PUBLIC -D_GNU_SOURCE\n    # obviously needs to be private, otherwise the value leaks into users of this lib\n    PRIVATE -DCOMPONENT_NAME=\"lib\"\n)\nif(build_32bit_preload_library)\n    target_compile_options(${bypass_lib}\n        PRIVATE -DPRELOAD_LIB_NAME_32BIT=\"$<TARGET_FILE_NAME:${preload_lib_32bit}>\"\n    )\n    target_sources(${bypass_lib} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${preload_lib_32bit}.h)\nendif()\n\ninclude(CheckCSourceCompiles)\nmessage(STATUS \"Checking whether memfd_create(...) is available\")\ncheck_c_source_compiles(\"\n    #define _GNU_SOURCE\n    #include <sys/mman.h>\n    int main(int argc, char** argv) {\n        memfd_create(\\\"test\\\", 0);\n    }\n    \"\n    HAVE_MEMFD_CREATE\n)\n\nif(HAVE_MEMFD_CREATE)\n    target_compile_options(${bypass_lib} PUBLIC -DHAVE_MEMFD_CREATE)\nelse()\n    message(WARNING \"memfd_create not available, falling back to shm_open\")\n    target_link_libraries(${bypass_lib} PRIVATE rt)\nendif()\n\nadd_executable(${bypass_bin} bypass_main.cpp)\ntarget_link_libraries(${bypass_bin} ${bypass_lib})\ntarget_compile_options(${bypass_bin}\n    PRIVATE -DCOMPONENT_NAME=\"bin\"\n)\n\nadd_executable(${binfmt_interpreter} interpreter_main.cpp)\ntarget_link_libraries(${binfmt_interpreter} ${bypass_lib})\ntarget_compile_options(${binfmt_interpreter}\n    PRIVATE -DCOMPONENT_NAME=\"interpreter\"\n    PRIVATE -DAPPIMAGELAUNCHER_PATH=\"${CMAKE_INSTALL_PREFIX}/${_bindir}/$<TARGET_FILE_NAME:AppImageLauncher>\"\n)\n# static linking makes the F (fix binary) mode more reliable, as the binary as well as all its resources are completely\n# preloaded by binfmt-misc, avoiding runtime dependencies on libc, libstdc++ etc.\ntarget_link_options(${binfmt_interpreter}\n    PRIVATE -static -static-libgcc -static-libstdc++\n)\n\n# no need to set rpath on bypass binary, it doesn't depend on any private libraries\n# the preload lib is used via its absolute path anyway\n\ninstall(\n    TARGETS ${bypass_bin} ${preload_lib} ${binfmt_interpreter}\n    RUNTIME DESTINATION ${_private_libdir} COMPONENT APPIMAGELAUNCHER\n    LIBRARY DESTINATION ${_private_libdir} COMPONENT APPIMAGELAUNCHER\n)\nif(build_32bit_preload_library)\n    install(\n        TARGETS ${preload_lib}\n        LIBRARY DESTINATION ${_private_libdir}\n    )\nendif()\n"
  },
  {
    "path": "src/binfmt-bypass/bypass_main.cpp",
    "content": "// system headers\n#include <vector>\n\n// own headers\n#include \"logging.h\"\n#include \"lib.h\"\n\nint main(int argc, char** argv) {\n    if (argc <= 1) {\n        log_message(\"Usage: %s <AppImage file> [args...]\\n\", argv[0]);\n        return EXIT_CODE_FAILURE;\n    }\n\n    std::vector<char*> args(&argv[2], &argv[argc]);\n    return bypassBinfmtAndRunAppImage(argv[1], args);\n}\n"
  },
  {
    "path": "src/binfmt-bypass/elf.cpp",
    "content": "// system headers\n#include <cstdio>\n#include <cstdlib>\n#include <cstdint>\n#include <type_traits>\n#include <linux/elf.h>\n#include <byteswap.h>\n#include <fstream>\n#include <iostream>\n#include <stdexcept>\n\n// own headers\n#include \"elf.h\"\n#include \"logging.h\"\n\n#if __BYTE_ORDER == __LITTLE_ENDIAN\n#define NATIVE_BYTE_ORDER ELFDATA2LSB\n#elif __BYTE_ORDER == __BIG_ENDIAN\n#define NATIVE_BYTE_ORDER ELFDATA2MSB\n#else\n#error \"Unknown machine endian\"\n#endif\n\ntemplate<typename T>\nT bswap(T val) = delete;\n\ntemplate<>\nuint16_t bswap(uint16_t val) {\n    return bswap_16(val);\n}\n\ntemplate<>\nuint32_t bswap(uint32_t val) {\n    return bswap_32(val);\n}\n\ntemplate<>\nunsigned long long bswap(unsigned long long val) {\n    return bswap_64(val);\n}\n\ntemplate<typename EhdrT, typename ValT>\nvoid swap_data_if_necessary(const EhdrT& ehdr, ValT& val) {\n    static_assert(std::is_same<Elf64_Ehdr, EhdrT>::value || std::is_same<Elf32_Ehdr, EhdrT>::value,\n                  \"must be Elf{32,64}_Ehdr\");\n\n    if (ehdr.e_ident[EI_DATA] != NATIVE_BYTE_ORDER) {\n        val = bswap(val);\n    }\n}\n\ntemplate<typename EhdrT, typename ShdrT>\noff_t get_elf_size(std::ifstream& ifs)\n{\n    static_assert(std::is_same<Elf64_Ehdr, EhdrT>::value || std::is_same<Elf32_Ehdr, EhdrT>::value,\n                  \"must be Elf{32,64}_Ehdr\");\n    static_assert(std::is_same<Elf64_Shdr, ShdrT>::value || std::is_same<Elf32_Shdr, ShdrT>::value,\n                  \"must be Elf{32,64}_Shdr\");\n\n    EhdrT elf_header{};\n\n    ifs.seekg(0, std::ifstream::beg);\n    ifs.read(reinterpret_cast<char*>(&elf_header), sizeof(elf_header));\n\n    if (!ifs) {\n        log_error(\"failed to read ELF header\\n\");\n        return -1;\n    }\n\n    swap_data_if_necessary(elf_header, elf_header.e_shoff);\n    swap_data_if_necessary(elf_header, elf_header.e_shentsize);\n    swap_data_if_necessary(elf_header, elf_header.e_shnum);\n    swap_data_if_necessary(elf_header, elf_header.e_shnum);\n\n    off_t last_shdr_offset = elf_header.e_shoff + (elf_header.e_shentsize * (elf_header.e_shnum - 1));\n    ShdrT section_header{};\n\n    ifs.seekg(last_shdr_offset, std::ifstream::beg);\n    ifs.read(reinterpret_cast<char*>(&section_header), sizeof(elf_header));\n\n    if (!ifs) {\n        log_error(\"failed to read ELF section header\\n\");\n        return -1;\n    }\n\n    swap_data_if_necessary(elf_header, section_header.sh_offset);\n    swap_data_if_necessary(elf_header, section_header.sh_size);\n\n    /* ELF ends either with the table of section headers (SHT) or with a section. */\n    off_t sht_end = elf_header.e_shoff + (elf_header.e_shentsize * elf_header.e_shnum);\n    off_t last_section_end = section_header.sh_offset + section_header.sh_size;\n    return sht_end > last_section_end ? sht_end : last_section_end;\n}\n\ntemplate<typename EhdrT, typename ShdrT>\nssize_t get_pt_dynamic_offset(std::ifstream& ifs)\n{\n    static_assert(std::is_same<Elf64_Ehdr, EhdrT>::value || std::is_same<Elf32_Ehdr, EhdrT>::value,\n                  \"must be Elf{32,64}_Ehdr\");\n    static_assert(std::is_same<Elf64_Shdr, ShdrT>::value || std::is_same<Elf32_Shdr, ShdrT>::value,\n                  \"must be Elf{32,64}_Shdr\");\n\n    EhdrT elf_header{};\n\n    ifs.seekg(0, std::ifstream::beg);\n    ifs.read(reinterpret_cast<char*>(&elf_header), sizeof(elf_header));\n\n    if (!ifs) {\n        log_error(\"failed to read ELF header\\n\");\n        return -1;\n    }\n\n    swap_data_if_necessary(elf_header, elf_header.e_shoff);\n    swap_data_if_necessary(elf_header, elf_header.e_shentsize);\n    swap_data_if_necessary(elf_header, elf_header.e_shnum);\n    swap_data_if_necessary(elf_header, elf_header.e_shnum);\n\n    off_t last_shdr_offset = elf_header.e_shoff + (elf_header.e_shentsize * (elf_header.e_shnum - 1));\n    ShdrT section_header{};\n\n    ifs.seekg(last_shdr_offset, std::ifstream::beg);\n    ifs.read(reinterpret_cast<char*>(&section_header), sizeof(elf_header));\n\n    if (!ifs) {\n        log_error(\"failed to read ELF section header\\n\");\n        return -1;\n    }\n\n    swap_data_if_necessary(elf_header, section_header.sh_offset);\n    swap_data_if_necessary(elf_header, section_header.sh_size);\n\n    /* ELF ends either with the table of section headers (SHT) or with a section. */\n    off_t sht_end = elf_header.e_shoff + (elf_header.e_shentsize * elf_header.e_shnum);\n    off_t last_section_end = section_header.sh_offset + section_header.sh_size;\n    return sht_end > last_section_end ? sht_end : last_section_end;\n}\n\nbool is_32bit_elf(std::ifstream& ifs) {\n    if (!ifs) {\n        log_error(\"failed to read e_ident from ELF file\\n\");\n        return false;\n    }\n\n    // for the beginning, we just need to read e_ident to determine ELF class (i.e., either 32-bit or 64-bit)\n    // that way, we can decide which way to go\n    // the easiest way is to just use the ELF API\n    Elf64_Ehdr ehdr;\n\n    ifs.read(reinterpret_cast<char*>(&ehdr.e_ident), EI_NIDENT);\n\n    switch (ehdr.e_ident[EI_CLASS]) {\n        case ELFCLASS32: {\n            return true;\n        }\n        case ELFCLASS64: {\n            return false;\n        }\n    }\n\n    throw std::logic_error{\"ELF binary is neither 32-bit nor 64-bit\"};\n}\n\nbool is_32bit_elf(const std::string& filename) {\n    std::ifstream ifs(filename);\n\n    if (!ifs) {\n        log_error(\"could not open file: %s\\n\", filename.c_str());\n        return false;\n    }\n\n    return is_32bit_elf(ifs);\n}\n\nbool is_statically_linked_elf(std::ifstream& ifs) {\n    if (!ifs) {\n        log_error(\"failed to read e_ident from ELF file\\n\");\n        return false;\n    }\n\n    ssize_t pt_dynamic_offset;\n\n    if (is_32bit_elf(ifs)) {\n        pt_dynamic_offset = get_pt_dynamic_offset<Elf32_Ehdr, Elf32_Shdr>(ifs);\n    } else {\n        pt_dynamic_offset = get_pt_dynamic_offset<Elf64_Ehdr, Elf64_Shdr>(ifs);\n    }\n\n    return pt_dynamic_offset != -1;\n}\n\nbool is_statically_linked_elf(const std::string& filename) {\n    std::ifstream ifs(filename);\n\n    if (!ifs) {\n        log_error(\"could not open file: %s\\n\", filename.c_str());\n        return false;\n    }\n\n    return is_statically_linked_elf(ifs);\n}\n\nssize_t elf_binary_size(const std::string& filename) {\n    std::ifstream ifs(filename);\n\n    if (!ifs) {\n        log_error(\"could not open file\\n\");\n        return -1;\n    }\n\n    if (is_32bit_elf(ifs)) {\n        return get_elf_size<Elf32_Ehdr, Elf32_Shdr>(ifs);\n    } else {\n        return get_elf_size<Elf64_Ehdr, Elf64_Shdr>(ifs);\n    }\n}\n"
  },
  {
    "path": "src/binfmt-bypass/elf.h",
    "content": "#pragma once\n\n#include <string>\n\n/**\n * Check whether file is linked staticallly.\n * @param filename path to ELF file\n * @return true if file is statically linked, false otherwise\n */\nbool is_statically_linked_elf(const std::string& filename);\n\n/**\n * Calculate size of ELF binary. Useful e.g., to estimate the size of the runtime in an AppImage.\n * @param filename path to ELF file\n * @return size of ELF part in bytes\n */\nssize_t elf_binary_size(const std::string& filename);\n\n/**\n * Check whether a given ELF file is a 32-bit binary.\n * @param filename path to ELF file\n * @return true if it's a 32-bit ELF, false otherwise\n */\nbool is_32bit_elf(const std::string& filename);\n"
  },
  {
    "path": "src/binfmt-bypass/fix-preload-library.sh",
    "content": "#! /bin/bash\n\nset -euo pipefail\n\n# 2.17 ensures compatibility with CentOS 7 and beyond\n# cf. https://gist.github.com/wagenet/35adca1a032cec2999d47b6c40aa45b1\nglibc_ok_version=\"2.17\"\n\nfind_too_new_symbols() {\n    glibc_symbols=( \"$(nm --dynamic --undefined-only --with-symbol-versions \"$1\" | grep \"GLIBC_\")\" )\n\n    for glibc_symbol in \"${glibc_symbols[@]}\"; do\n        # shellcheck disable=SC2001\n        glibc_symbol_version=\"$(sed 's|.*GLIBC_\\([\\.0-9]\\+\\)$|\\1|' <<< \"$glibc_symbol\")\"\n        newest_glibc_symbol_version=\"$(echo -e \"$glibc_ok_version\\\\n$glibc_symbol_version\" | sort -V | tail -n1)\"\n\n        # make sure the newest version found is <= the one we define as ok\n        if [[ \"$newest_glibc_symbol_version\" == \"$glibc_ok_version\" ]]; then\n            return 1\n        fi\n    done\n\n    return 0\n}\n\nfor file in \"$@\"; do\n    # obviously, this is a hack, but it should work well enough since we just need to do it for one single symbol from libdl\n    patchelf --debug --clear-symbol-version dlsym \"$file\"\n\n    nm_data=\"$(nm --dynamic --undefined-only --with-symbol-versions \"$file\")\"\n\n    if find_too_new_symbols \"$file\"; then\n        echo \"Error: found symbol version markers newer than $glibc_ok_version:\"\n        echo \"$nm_data\"\n        exit 1\n    fi\ndone\n"
  },
  {
    "path": "src/binfmt-bypass/interpreter_main.cpp",
    "content": "// system headers\n#include <cassert>\n#include <unistd.h>\n#include <vector>\n\n// own headers\n#include \"logging.h\"\n#include \"lib.h\"\n\nbool executableExists(const std::string& path) {\n    if (access(path.c_str(), X_OK) != 0) {\n        log_debug(\"executable %s does not exist\\n\", path.c_str());\n        return false;\n    }\n\n    return true;\n}\n\nint main(int argc, char** argv) {\n    log_debug(\"Welcome to AppImageLauncher's binfmt_misc interpreter!\\n\");\n\n    if (argc <= 1) {\n        log_message(\"Usage: %s <AppImage file> [args...]\\n\", argv[0]);\n        return EXIT_CODE_FAILURE;\n    }\n\n    const std::string appImagePath = argv[1];\n    std::vector<char*> args(&argv[2], &argv[argc]);\n\n    // optimistic approach\n    bool useAppImageLauncher = true;\n\n    if (!executableExists(APPIMAGELAUNCHER_PATH)) {\n        log_message(\n            \"AppImageLauncher not found at %s, launching AppImage directly: %s\\n\",\n            APPIMAGELAUNCHER_PATH,\n            appImagePath.c_str()\n        );\n        useAppImageLauncher = false;\n    }\n\n    if (getenv(\"APPIMAGELAUNCHER_DISABLE\") != nullptr) {\n        log_message(\n            \"APPIMAGELAUNCHER_DISABLE set, launching AppImage directly: %s\\n\",\n            APPIMAGELAUNCHER_PATH,\n            appImagePath.c_str()\n        );\n        useAppImageLauncher = false;\n    }\n\n    if (!useAppImageLauncher) {\n        return bypassBinfmtAndRunAppImage(argv[1], args);\n    }\n\n    log_debug(\n        \"AppImageLauncher found at %s, launching AppImage %s with it\\n\",\n        APPIMAGELAUNCHER_PATH,\n        appImagePath.c_str()\n    );\n\n    // needs to be done in inverse order\n    args.emplace(args.begin(), strdup(appImagePath.c_str()));\n    args.emplace(args.begin(), strdup(APPIMAGELAUNCHER_PATH));\n\n    const auto rv = execv(APPIMAGELAUNCHER_PATH, args.data());\n\n    assert(rv == -1);\n    log_error(\"execv(%s, ...) failed\\n\");\n    return EXIT_CODE_FAILURE;\n}\n"
  },
  {
    "path": "src/binfmt-bypass/lib.cpp",
    "content": "// system headers\n#include <cstdio>\n#include <sys/mman.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <wait.h>\n#include <vector>\n#include <memory.h>\n#include <memory>\n#include <stdexcept>\n#include <cassert>\n#include <filesystem>\n\n// own headers\n#include \"elf.h\"\n#include \"logging.h\"\n#include \"lib.h\"\n#include \"binfmt-bypass-preload.h\"\n\n#ifdef PRELOAD_LIB_NAME_32BIT\n    #include \"binfmt-bypass-preload_32bit.h\"\n#endif\n\n#define EXIT_CODE_FAILURE 0xff\n\nbool copy_and_patch_runtime(int fd, const char* const appimage_filename, const ssize_t elf_size) {\n    // copy runtime header into memfd \"file\"\n    {\n        const auto realfd = open(appimage_filename, O_RDONLY);\n        std::vector<char> buffer(elf_size);\n        // TODO: check for errors\n        read(realfd, buffer.data(), elf_size);\n        write(fd, buffer.data(), elf_size);\n        close(realfd);\n    }\n\n    // erase magic bytes\n    lseek(fd, 8, SEEK_SET);\n    char null_buf[]{0, 0, 0};\n    write(fd, null_buf, 3);\n\n    // TODO: handle errors properly\n    return true;\n}\n\n#ifdef HAVE_MEMFD_CREATE\n\n// if memfd_create is available, we should use it as it has a few important advantages over older solutions like\n// shm_open or classic tempfiles\n\nint create_memfd_with_patched_runtime(const char* const appimage_filename, const ssize_t elf_size) {\n    // as we call exec() after fork() to create a child process (the parent keeps it alive, the child doesn't require\n    // access anyway), we enable close-on-exec\n    const auto memfd = memfd_create(\"runtime\", MFD_CLOEXEC);\n\n    if (memfd < 0) {\n        log_error(\"memfd_create failed: %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    if (!copy_and_patch_runtime(memfd, appimage_filename, elf_size)) {\n        log_error(\"failed to copy and patch runtime\\n\");\n        close(memfd);\n        return -1;\n    }\n\n    return memfd;\n}\n\n#else\n\n// in case memfd_create is *not* available, we fall back to shm_open\n// it requires a few more lines of code (e.g., changing permissions to limit access to the created file)\n// also, we can't just\n\nint create_shm_fd_with_patched_runtime(const char* const appimage_filename, const ssize_t elf_size) {\n    // let's hope that mktemp returns a unique filename; if not, shm_open returns an error, thanks to O_EXCL\n    // the file exists only for a fraction of a second normally, so the chances are not too bad\n    char mktemp_template[] = \"runtime-XXXXXX\";\n    const char* runtime_filename = mktemp(mktemp_template);\n\n    if (runtime_filename[0] == '\\0') {\n        log_error(\"failed to create temporary filename\\n\");\n        return -1;\n    }\n\n    // shm_open doesn't survive over exec(), so we _have to_ keep this process alive and create a child for the runtime\n    // the good news is: we don't have to worry about setting flags to close-on-exec\n    int writable_fd = shm_open(runtime_filename, O_RDWR | O_CREAT, 0700);\n\n    if (writable_fd < 0) {\n        log_error(\"shm_open failed (writable): %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    // open file read-only before unlinking the file, this is the fd we return later\n    // otherwise we'll end up with ETXTBSY when trying to exec() it\n    int readable_fd = shm_open(runtime_filename, O_RDONLY, 0);\n\n    if (readable_fd < 0) {\n        log_error(\"shm_open failed (read-only): %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    // let's make sure the file goes away when it's closed\n    // as long as we don't close the fd, it won't go away, but if we do, the OS takes care of freeing the memory\n    if (shm_unlink(runtime_filename) != 0) {\n        log_error(\"shm_unlink failed: %s\\n\", strerror(errno));\n        close(writable_fd);\n        return -1;\n    }\n\n    if (!copy_and_patch_runtime(writable_fd, appimage_filename, elf_size)) {\n        log_error(\"failed to copy and patch runtime\\n\");\n        close(writable_fd);\n        return -1;\n    }\n\n    // close writable fd and return readable one\n    close(writable_fd);\n    return readable_fd;\n}\n\n#endif\n\nstd::filesystem::path find_preload_library(bool is_32bit) {\n    // packaging is now done using ld-p-native_packages which does not make guarantees about the install path\n    // therefore, we need to look up the path of the preload library in relation to the current binary's path\n    // since we use the F (fix binary) binfmt mode nowadays to enable the use of the interpreter in different cgroups,\n    // namespaces or changeroots, we may not find the library there, but we'll at least try\n\n    // we expect the library to be placed next to this binary\n    const auto own_binary_path = std::filesystem::read_symlink(\"/proc/self/exe\");\n    const auto dir_path = own_binary_path.parent_path();\n\n    std::filesystem::path rv = dir_path;\n\n#ifdef PRELOAD_LIB_NAME_32BIT\n    if (is_32bit) {\n        rv /= PRELOAD_LIB_NAME_32BIT;\n        return rv;\n    }\n#endif\n\n    rv /= PRELOAD_LIB_NAME;\n    return rv;\n}\n\n/**\n * Create a temporary file within the shm file system and maintain its existence using the RAII principle.\n * This is a first attempt, creating the files within /tmp. Future versions could try to put the files next to the\n * AppImage, use a reproducible path to create the lib file just once, use shm_open etc.\n */\nclass TemporaryPreloadLibFile {\npublic:\n    TemporaryPreloadLibFile(const unsigned char* libContents, const std::streamsize libContentsSize) {\n        char tempFilePattern[] = \"/tmp/appimagelauncher-preload-XXXXXX.so\";\n\n        _fd = mkstemps(tempFilePattern, 3);\n        if (_fd == -1) {\n            throw std::runtime_error(\"could not create temporary preload lib file\");\n        }\n\n        _path = tempFilePattern;\n\n        if (write(_fd, libContents, libContentsSize) != libContentsSize) {\n            throw std::runtime_error(\"failed to write contents to temporary preload lib\");\n        }\n    }\n\n    ~TemporaryPreloadLibFile() {\n        close(_fd);\n        unlink(_path.c_str());\n    };\n\n    std::string path() {\n        return _path;\n    }\n\nprivate:\n    int _fd;\n    std::filesystem::path _path;\n};\n\n// need to keep track of the subprocess pid in a global variable, as signal handlers in C(++) are simple interrupt\n// handlers that are not aware of any state in main()\n// note that we only connect the signal handler once we have created a subprocess, i.e., we don't need to worry about\n// subprocess_pid not being set yet\n// it's best practice to implement a check anyway, though\nstatic pid_t subprocess_pid = 0;\n\nvoid forwardSignal(int signal) {\n    if (subprocess_pid != 0) {\n        log_debug(\"forwarding signal %d to subprocess %ld\\n\", signal, subprocess_pid);\n        kill(subprocess_pid, signal);\n    } else {\n        log_error(\"signal %d received but no subprocess created yet, shutting down\\n\", signal);\n        exit(signal);\n    }\n}\n\nint bypassBinfmtAndRunAppImage(const std::string& appimage_path, const std::vector<char*>& target_args) {\n    // read size of AppImage runtime (i.e., detect size of ELF binary)\n    const auto size = elf_binary_size(appimage_path.c_str());\n\n    if (size < 0) {\n        log_error(\"failed to detect runtime size\\n\");\n        return EXIT_CODE_FAILURE;\n    }\n\n#ifdef HAVE_MEMFD_CREATE\n    // create \"file\" in memory, copy runtime there and patch out magic bytes\n    const int runtime_fd = create_memfd_with_patched_runtime(appimage_path.c_str(), size);\n#else\n    const int runtime_fd = create_shm_fd_with_patched_runtime(appimage_filename.c_str(), size);\n#endif\n\n    if (runtime_fd < 0) {\n        log_error(\"failed to set up in-memory file with patched runtime\\n\");\n        return EXIT_CODE_FAILURE;\n    }\n\n    // to keep alive the memfd, we launch the AppImage as a subprocess\n    if ((subprocess_pid = fork()) == 0) {\n        // create new argv array, using passed filename as argv[0]\n        std::vector<char*> new_argv;\n\n        new_argv.push_back(strdup(appimage_path.c_str()));\n\n        // insert remaining args, if any\n        for (const auto& arg : target_args) {\n            new_argv.push_back(strdup(arg));\n        }\n\n        // needs to be null terminated, of course\n        new_argv.push_back(nullptr);\n\n        // preload our library\n        auto preload_lib_path = find_preload_library(is_32bit_elf(appimage_path));\n\n        log_debug(\"preload lib path: %s\\n\", preload_lib_path.string().c_str());\n\n        // may or may not be used, but must survive until this application terminates\n        std::unique_ptr<TemporaryPreloadLibFile> temporaryPreloadLibFile;\n\n        if (!std::filesystem::exists(preload_lib_path)) {\n            log_warning(\"could not find preload library, creating new temporary file for it\\n\");\n\n#ifdef PRELOAD_LIB_NAME_32BIT\n            if (is_32bit_elf(appimage_path)) {\n                temporaryPreloadLibFile = std::make_unique<TemporaryPreloadLibFile>(\n                    libbinfmt_bypass_preload_32bit_so,\n                    libbinfmt_bypass_preload_32bit_so_len\n                );\n            }\n#endif\n\n            if (temporaryPreloadLibFile == nullptr) {\n                temporaryPreloadLibFile = std::make_unique<TemporaryPreloadLibFile>(\n                    libbinfmt_bypass_preload_so,\n                    libbinfmt_bypass_preload_so_len\n                );\n            }\n\n            assert(temporaryPreloadLibFile != nullptr);\n\n            preload_lib_path = temporaryPreloadLibFile->path();\n        }\n\n        if (!is_statically_linked_elf(appimage_path)) {\n            log_debug(\"library to preload: %s\\n\", preload_lib_path.string().c_str());\n            setenv(\"LD_PRELOAD\", preload_lib_path.c_str(), true);\n        }\n\n        // calculate absolute path to AppImage, for use in the preloaded lib\n        char* abs_appimage_path = realpath(appimage_path.c_str(), nullptr);\n        log_debug(\"absolute AppImage path: %s\\n\", abs_appimage_path);\n        // TARGET_APPIMAGE is further needed for static runtimes which do not make any use of LD_PRELOAD\n        setenv(\"REDIRECT_APPIMAGE\", abs_appimage_path, true);\n        setenv(\"TARGET_APPIMAGE\", abs_appimage_path, true);\n\n        // launch memfd directly, no path needed\n        log_debug(\"fexecve(...)\\n\");\n        fexecve(runtime_fd, new_argv.data(), environ);\n\n        log_error(\"failed to execute patched runtime: %s\\n\", strerror(errno));\n        return EXIT_CODE_FAILURE;\n    }\n\n    // now that we have a subprocess and know its process ID, it's time to set up signal forwarding\n    // note that from this point on, we don't handle signals ourselves any more, but rely on the subprocess to exit\n    // properly\n    for (int i = 0; i < 32; ++i) {\n        signal(i, forwardSignal);\n    }\n\n    // wait for child process to exit, and exit with its return code\n    int status;\n    wait(&status);\n\n    // clean up\n    close(runtime_fd);\n\n    // calculate return code based on child's behavior\n    int child_retcode;\n\n    if (WIFSIGNALED(status) != 0) {\n        child_retcode = WTERMSIG(status);\n        log_error(\"child exited with code %d\\n\", child_retcode);\n    } else if (WIFEXITED(status) != 0) {\n        child_retcode = WEXITSTATUS(status);\n        log_debug(\"child exited normally with code %d\\n\", child_retcode);\n    } else {\n        log_error(\"unknown error: child didn't exit with signal or regular exit code\\n\");\n        child_retcode = EXIT_CODE_FAILURE;\n    }\n\n    return child_retcode;\n}\n"
  },
  {
    "path": "src/binfmt-bypass/lib.h",
    "content": "#pragma once\n\n// system headers\n#include <string>\n#include <vector>\n\n#define EXIT_CODE_FAILURE 0xff\n\nint bypassBinfmtAndRunAppImage(const std::string& appimage_path, const std::vector<char*>& target_args);\n"
  },
  {
    "path": "src/binfmt-bypass/logging.h",
    "content": "#pragma once\n\n// system headers\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#ifndef COMPONENT_NAME\n#error component name undefined\n#endif\n\ninline static int v_log_message(const char* const format, va_list args) {\n    static const char prefix[] = \"[appimagelauncher-binfmt-bypass/\" COMPONENT_NAME \"] \";\n\n    char* patched_format = (char*) (malloc(strlen(format) + strlen(prefix) + 1));\n    strcpy(patched_format, prefix);\n    strcat(patched_format, format);\n\n    return vfprintf(stderr, patched_format, args);\n}\n\ninline static int v_log_message_prefix(const char* const prefix, const char* const format, va_list args) {\n    char* patched_format = (char*) (malloc(strlen(format) + strlen(prefix) + 2 + 1));\n    strcpy(patched_format, prefix);\n    strcat(patched_format, \": \");\n    strcat(patched_format, format);\n\n    return v_log_message(patched_format, args);\n}\n\ninline static int log_message(const char* const format, ...) {\n    va_list args;\n    va_start(args, format);\n\n    int result = v_log_message(format, args);\n\n    va_end(args);\n\n    return result;\n}\n\ninline static void log_debug(const char* const format, ...) {\n    if (getenv(\"DEBUG\") == NULL) {\n        return;\n    }\n\n    va_list args;\n    va_start(args, format);\n\n    v_log_message_prefix(\"DEBUG\", format, args);\n\n    va_end(args);\n}\n\ninline static void log_error(const char* const format, ...) {\n    va_list args;\n    va_start(args, format);\n\n    v_log_message_prefix(\"ERROR\", format, args);\n\n    va_end(args);\n}\n\n\ninline static void log_warning(const char* const format, ...) {\n    va_list args;\n    va_start(args, format);\n\n    v_log_message_prefix(\"WARNING\", format, args);\n\n    va_end(args);\n}\n"
  },
  {
    "path": "src/binfmt-bypass/preload.c",
    "content": "// system headers\n#include <stdio.h>\n#include <dlfcn.h>\n#include <unistd.h>\n#include <memory.h>\n#include <stdlib.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <errno.h>\n#include <stdbool.h>\n\n// own headers\n#include \"logging.h\"\n\n// saw this trick somewhere on the Internet... don't recall where it was, but it works well\n#ifndef RTLD_NEXT\n#define RTLD_NEXT ((void*) -1l)\n#endif\n\n#define REAL_LIBC RTLD_NEXT\n\n// TODO: move into central header, it's the same value in main.cpp\n#define EXIT_CODE_FAILURE 0xff\n\n// pointers to actual implementations in libc\n// will be initialized by __init()\n// TODO: create a macro for this pattern (DRY)\nstatic char* (*__libc_realpath)(const char*, char*) = NULL;\nstatic int (*__libc_open)(const char*, int) = NULL;\nstatic ssize_t (*__libc_readlink)(const char*, void*, size_t) = NULL;\n\n// TODO: write __init() and call that from all functions, loading all required symbols, the AppImage path etc. once\n// to improve performance\n\n// DRY\nstatic const char proc_self_exe[] = \"/proc/self/exe\";\n\n\nvoid __init() {\n    static bool initialized = false;\n\n    if (!initialized) {\n        initialized = true;\n\n        // get rid of $LD_PRELOAD in the first binary which this library is preloaded into (should be the runtime)\n        // the easiest way is to wait for one of these functions to be used, then unset it\n        unsetenv(\"LD_PRELOAD\");\n\n        // load symbols from libc\n        __libc_readlink = (ssize_t (*) (const char*, void*, size_t)) dlsym(REAL_LIBC, \"readlink\");\n        __libc_realpath = (char* (*) (const char*, char*)) dlsym(REAL_LIBC, \"realpath\");\n        __libc_open = (int (*) (const char*, int)) dlsym(REAL_LIBC, \"open\");\n\n        if (__libc_readlink == NULL || __libc_realpath == NULL || __libc_open == NULL) {\n            log_error(\"failed to load symbol from libc\\n\");\n            exit(EXIT_CODE_FAILURE);\n        }\n    }\n}\n\nchar* __abs_appimage_path() {\n    __init();\n\n    static const char env_var_name[] = \"TARGET_APPIMAGE\";\n\n    char* appimage_var = getenv(env_var_name);\n\n    if (appimage_var == NULL || appimage_var[0] == '\\0') {\n        log_error(\"$%s not set\\n\", env_var_name);\n        exit(EXIT_CODE_FAILURE);\n    }\n\n    // make path absolute if needed (best effort, it's better to pass an absolute value)\n    if (appimage_var[0] != '/') {\n        log_warning(\"$%s value is not absolute, trying to make it absolute\\n\", env_var_name);\n\n        char* abspath = calloc(PATH_MAX, sizeof(char));\n\n        if (readlink(appimage_var, abspath, sizeof(abspath)) == -1) {\n            log_error(\"readlink failed on %s: %s\\n\", appimage_var, strerror(errno));\n            exit(EXIT_CODE_FAILURE);\n        }\n\n        return abspath;\n    }\n\n    return strdup(appimage_var);\n}\n\n__attribute__((visibility (\"default\")))\nextern ssize_t readlink(const char* path, char* buf, size_t len) {\n    __init();\n\n    log_debug(\"readlink %s, len %ld\\n\", path, len);\n\n    if (strncmp(path, proc_self_exe, strlen(proc_self_exe)) == 0) {\n        char* abspath = __abs_appimage_path();\n\n        log_debug(\"redirecting readlink to %s\\n\", abspath);\n\n        size_t ret = strlen(abspath);\n\n        strncpy(buf, abspath, ret);\n\n        log_debug(\"buf: %s, len: %ld\\n\", buf, ret);\n\n        free(abspath);\n        return ret;\n    }\n\n    return __libc_readlink(path, buf, len);\n}\n\n__attribute__((visibility (\"default\")))\nextern char* realpath(const char* name, char* resolved) {\n    __init();\n\n    log_debug(\"realpath %s, %s\\n\", name, resolved);\n\n    if (strncmp(name, proc_self_exe, strlen(proc_self_exe)) == 0) {\n        char* appimage = __abs_appimage_path();\n\n        log_debug(\"changing realpath destination to %s\\n\", appimage);\n\n        if (resolved == NULL) {\n            resolved = appimage;\n        } else {\n            strncpy(resolved, appimage, PATH_MAX);\n            free(appimage);\n        }\n\n        return resolved;\n    }\n\n    char* retval = __libc_realpath(name, resolved);\n\n    log_debug(\"realpath result: %s -> %s, retval %s\\n\", name, resolved, retval);\n\n    return retval;\n}\n\n// used by squashfuse, specifically util.c/sqfs_fd_open\n__attribute__((visibility (\"default\")))\nextern int open(const char* file, int flags, ...) {\n    __init();\n\n    log_debug(\"open(%s, %d)\\n\", file, flags);\n\n    char* abspath = NULL;\n\n    if (strncmp(file, proc_self_exe, strlen(proc_self_exe)) == 0) {\n        abspath = __abs_appimage_path();\n        log_debug(\"redirecting open to %s\\n\", abspath);\n        file = abspath;\n    }\n\n    int result = __libc_open(file, flags);\n\n    if (abspath != NULL) {\n        free(abspath);\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "src/cli/CMakeLists.txt",
    "content": "add_subdirectory(logging)\n\nadd_subdirectory(commands)\n\nadd_executable(ail-cli cli_main.cpp)\ntarget_link_libraries(ail-cli PUBLIC cli_commands cli_logging)\n\nset_property(\n    TARGET ail-cli\n    PROPERTY INSTALL_RPATH ${_rpath}\n)\n\ninstall(\n    TARGETS ail-cli\n    DESTINATION ${_bindir} COMPONENT APPIMAGELAUNCHER_CLI\n)\n"
  },
  {
    "path": "src/cli/cli_main.cpp",
    "content": "// system headers\n#include <sstream>\n\n// library headers\n#include <QCoreApplication>\n#include <QCommandLineParser>\n\n// local headers\n#include \"CommandFactory.h\"\n#include \"exceptions.h\"\n#include \"logging.h\"\n\nusing namespace appimagelauncher::cli;\nusing namespace appimagelauncher::cli::commands;\n\nint main(int argc, char** argv) {\n    // we don't have support for UI (and don't want that), so let's tell shared to not display dialogs\n    setenv(\"_FORCE_HEADLESS\", \"1\", 1);\n\n    QCoreApplication app(argc, argv);\n\n    std::ostringstream version;\n    version << \"version \" << APPIMAGELAUNCHER_VERSION << \" \"\n            << \"(git commit \" << APPIMAGELAUNCHER_GIT_COMMIT << \"), built on \"\n            << APPIMAGELAUNCHER_BUILD_DATE;\n    QCoreApplication::setApplicationVersion(QString::fromStdString(version.str()));\n\n    QCommandLineParser parser;\n\n    parser.addPositionalArgument(\"<command>\", \"Command to run (see help for more information\");\n    parser.addPositionalArgument(\"[...]\", \"command-specific additional arguments\");\n    parser.addHelpOption();\n    parser.addVersionOption();\n\n    parser.process(app);\n\n    auto posArgs = parser.positionalArguments();\n\n    if (posArgs.isEmpty()) {\n        qerr() << parser.helpText().toStdString().c_str() << endl;\n\n        qerr() << \"Available commands:\" << endl;\n        qerr() << \"  integrate        Integrate AppImages passed as commandline arguments\" << endl;\n        qerr() << \"  unintegrate      Unintegrate AppImages passed as commandline arguments\" << endl;\n        qerr() << \"  would-integrate  Report whether AppImage would be integrated (exits with 0 if yes, any other code if not)\" << endl;\n\n        return 2;\n    }\n\n    auto commandName = posArgs.front();\n    posArgs.pop_front();\n\n    try {\n        auto command = CommandFactory::getCommandByName(commandName);\n        command->exec(posArgs);\n    } catch (const CommandNotFoundError& e) {\n        qerr() << e.what() << endl;\n        return 1;\n    } catch (const InvalidArgumentsError& e) {\n        qerr() << \"Invalid arguments: \" << e.what() << endl;\n        return 3;\n    } catch (const UsageError& e) {\n        qerr() << \"Usage error: \" << e.what() << endl;\n        return 3;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/cli/commands/CMakeLists.txt",
    "content": "add_library(cli_commands STATIC\n    Command.h\n    CommandFactory.h CommandFactory.cpp\n    exceptions.h\n    IntegrateCommand.h IntegrateCommand.cpp\n    UnintegrateCommand.h UnintegrateCommand.cpp\n    WouldIntegrateCommand.h WouldIntegrateCommand.cpp\n)\ntarget_link_libraries(cli_commands PUBLIC Qt5::Core shared cli_logging libappimage)\ntarget_include_directories(cli_commands PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})\n"
  },
  {
    "path": "src/cli/commands/Command.h",
    "content": "#pragma once\n\n// system headers\n#include <memory>\n\n// library headers\n#include <QList>\n#include <QString>\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            /**\n             * Base class for CLI command implementations.\n             */\n            class Command {\n            public:\n                // Run the command.\n                virtual void exec(QList<QString> arguments) = 0;\n            };\n        }\n    }\n}\n\n\n"
  },
  {
    "path": "src/cli/commands/CommandFactory.cpp",
    "content": "// local headers\n#include \"CommandFactory.h\"\n#include \"IntegrateCommand.h\"\n#include \"UnintegrateCommand.h\"\n#include \"WouldIntegrateCommand.h\"\n#include \"exceptions.h\"\n\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            std::shared_ptr<Command> CommandFactory::getCommandByName(const QString& commandName) {\n                if (commandName == \"integrate\") {\n                    return std::shared_ptr<Command>(new IntegrateCommand);\n                } else if (commandName == \"unintegrate\") {\n                    return std::make_shared<UnintegrateCommand>();\n                } else if (commandName == \"would-integrate\") {\n                    return std::make_shared<WouldIntegrateCommand>();\n                }\n\n                throw CommandNotFoundError(commandName);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/commands/CommandFactory.h",
    "content": "#pragma once\n\n// system headers\n#include <memory>\n\n// library headers\n#include <QString>\n\n// local headers\n#include <Command.h>\n\n/**\n * Creates Commands.\n */\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            class CommandFactory {\n            public:\n                static std::shared_ptr<Command> getCommandByName(const QString&);\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/commands/IntegrateCommand.cpp",
    "content": "// library headers\n#include <QFileInfo>\n\n// local headers\n#include \"IntegrateCommand.h\"\n#include \"exceptions.h\"\n#include \"shared.h\"\n#include \"logging.h\"\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            void IntegrateCommand::exec(QList<QString> arguments) {\n                if (arguments.empty()) {\n                    throw InvalidArgumentsError(\"No AppImages passed on commandline\");\n                }\n\n                // make sure all AppImages exist on disk before further processing\n                for (auto& path : arguments) {\n                    if (!QFileInfo(path).exists()) {\n                        throw UsageError(\"could not find file \" + path);\n                    }\n\n                    // make path absolute\n                    // that will just prevent mistakes in libappimage and shared etc.\n                    // (stuff like TryExec keys etc. being set to paths relative to CWD when running the command , ...)\n                    path = QFileInfo(path).absoluteFilePath();\n                }\n\n                for (const auto& pathToAppImage : arguments) {\n                    qout() << \"Processing \" << pathToAppImage << endl;\n\n                    if (!QFileInfo(pathToAppImage).isFile()) {\n                        qerr() << \"Warning: Not a file, skipping: \" << pathToAppImage << endl;\n                        continue;\n                    }\n\n                    if (!isAppImage(pathToAppImage)) {\n                        qerr() << \"Warning: Not an AppImage, skipping: \" << pathToAppImage << endl;\n                        continue;\n                    }\n\n                    if (hasAlreadyBeenIntegrated(pathToAppImage)) {\n                        if (desktopFileHasBeenUpdatedSinceLastUpdate(pathToAppImage)) {\n                            qout() << \"AppImage has been integrated already and doesn't need to be re-integrated, skipping\" << endl;\n                            continue;\n                        }\n\n                        qout() << \"AppImage has already been integrated, but needs to be reintegrated\" << endl;\n                    }\n\n                    auto pathToIntegratedAppImage = buildPathToIntegratedAppImage(pathToAppImage);\n\n                    // make sure integration directory exists\n                    // (important for new installations)\n                    // pretty ugly, but well, one taketh what the Qt API giveth\n                    QDir().mkdir(integratedAppImagesDestination().path());\n\n                    // check if it's already in the right place\n                    if (QFileInfo(pathToAppImage).absoluteFilePath() != QFileInfo(pathToIntegratedAppImage).absoluteFilePath()) {\n                        qout() << \"Moving AppImage to integration directory\" << endl;\n\n                        if (QFile::exists(pathToIntegratedAppImage) && !QFile(pathToIntegratedAppImage).remove()) {\n                            qerr() << \"Could not move AppImage into integration directory (error: failed to overwrite existing file)\" << endl;\n                            continue;\n                        }\n\n                        if (!QFile(pathToAppImage).rename(pathToIntegratedAppImage)) {\n                            qerr() << \"Cannot move AppImage to integration directory (permission problem?), attempting to copy instead\" << endl;\n\n                            if (!QFile(pathToAppImage).copy(pathToIntegratedAppImage)) {\n                                throw CliError(\"Failed to copy AppImage, giving up\");\n                            }\n                        }\n                    } else {\n                        qout() << \"AppImage already in integration directory\" << endl;\n                    }\n\n                    installDesktopFileAndIcons(pathToIntegratedAppImage);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/commands/IntegrateCommand.h",
    "content": "#pragma once\n\n// local headers\n#include \"Command.h\"\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            /**\n             * Integrates AppImages passed as arguments on the commandline.\n             */\n            class IntegrateCommand : public Command {\n                void exec(QList<QString> arguments) final;\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/commands/UnintegrateCommand.cpp",
    "content": "// library headers\n#include <QFileInfo>\n\n// local headers\n#include \"UnintegrateCommand.h\"\n#include \"exceptions.h\"\n#include \"shared.h\"\n#include \"logging.h\"\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            void UnintegrateCommand::exec(QList<QString> arguments) {\n                if (arguments.empty()) {\n                    throw InvalidArgumentsError(\"No AppImages passed on commandline\");\n                }\n\n                // make sure all AppImages exist on disk before further processing\n                for (auto& path : arguments) {\n                    if (!QFileInfo(path).exists()) {\n                        throw UsageError(\"could not find file \" + path);\n                    }\n\n                    // make path absolute\n                    // that will just prevent mistakes in libappimage and shared etc.\n                    // (stuff like TryExec keys etc. being set to paths relative to CWD when running the command , ...)\n                    path = QFileInfo(path).absoluteFilePath();\n                }\n\n                for (const auto& pathToAppImage : arguments) {\n                    qout() << \"Processing \" << pathToAppImage << endl;\n\n                    if (!QFileInfo(pathToAppImage).isFile()) {\n                        qerr() << \"Warning: Not a file, skipping: \" << pathToAppImage << endl;\n                        continue;\n                    }\n\n                    if (!isAppImage(pathToAppImage)) {\n                        qerr() << \"Warning: Not an AppImage, skipping: \" << pathToAppImage << endl;\n                        continue;\n                    }\n\n                    if (!hasAlreadyBeenIntegrated(pathToAppImage)) {\n                        qout() << \"AppImage has not been integrated yet, skipping\" << endl;\n                        continue;\n                    }\n\n                    unregisterAppImage(pathToAppImage);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/commands/UnintegrateCommand.h",
    "content": "#pragma once\n\n// local headers\n#include \"Command.h\"\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            /**\n             * Integrates AppImages passed as arguments on the commandline.\n             */\n            class UnintegrateCommand : public Command {\n                void exec(QList<QString> arguments) final;\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/commands/WouldIntegrateCommand.cpp",
    "content": "// library headers\n#include <QFileInfo>\n\nextern \"C\" {\n#include <appimage/appimage.h>\n}\n\n// local headers\n#include \"WouldIntegrateCommand.h\"\n#include \"exceptions.h\"\n#include \"shared.h\"\n#include \"logging.h\"\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            void WouldIntegrateCommand::exec(QList<QString> arguments) {\n                if (arguments.empty()) {\n                    throw InvalidArgumentsError(\"No AppImages passed on commandline\");\n                }\n\n                // make sure all AppImages exist on disk before further processing\n                for (auto& path : arguments) {\n                    if (!QFileInfo(path).exists()) {\n                        throw UsageError(\"could not find file \" + path);\n                    }\n\n                    // make path absolute\n                    // that will just prevent mistakes in libappimage and shared etc.\n                    // (stuff like TryExec keys etc. being set to paths relative to CWD when running the command , ...)\n                    path = QFileInfo(path).absoluteFilePath();\n                }\n\n                for (const auto& pathToAppImage : arguments) {\n                    qout() << \"Checking whether \" << pathToAppImage << \" should be integrated\" << endl;\n\n                    if (!QFileInfo(pathToAppImage).isFile()) {\n                        qerr() << \"Warning: Not a file, skipping: \" << pathToAppImage << endl;\n                        continue;\n                    }\n\n                    if (!isAppImage(pathToAppImage)) {\n                        qerr() << \"Warning: Not an AppImage, skipping: \" << pathToAppImage << endl;\n                        continue;\n                    }\n\n                    // TODO: refactor into a function that, e.g., returns an enum\n\n                    if (hasAlreadyBeenIntegrated(pathToAppImage)) {\n                        if (desktopFileHasBeenUpdatedSinceLastUpdate(pathToAppImage)) {\n                            throw WouldNotIntegrateError(\"AppImage has been integrated already and doesn't need to be re-integrated\");\n                        }\n\n                        qout() << \"AppImage has already been integrated, but needs to be reintegrated\" << endl;\n                    }\n\n\n                    // check for X-AppImage-Integrate=false\n                    auto shallNotBeIntegrated = appimage_shall_not_be_integrated(pathToAppImage.toStdString().c_str());\n                    if (shallNotBeIntegrated < 0) {\n                        throw CliError(\"AppImageLauncher error: appimage_shall_not_be_integrated() failed (returned \" + QString::number(shallNotBeIntegrated) + \")\");\n                    } else if (shallNotBeIntegrated > 0) {\n                        throw WouldNotIntegrateError(\"AppImage should not be integrated\");\n                    }\n\n                    if (pathToAppImage.startsWith(\"/tmp/.mount_\")) {\n                        throw WouldNotIntegrateError(\"AppImages in AppImages are not supposed to be integrated\");\n                    }\n\n                    // ignore terminal apps (fixes #2)\n                    auto isTerminalApp = appimage_is_terminal_app(pathToAppImage.toStdString().c_str());\n                    if (isTerminalApp < 0) {\n                        throw CliError(\"AppImageLauncher error: appimage_is_terminal_app() failed (returned \" + QString::number(isTerminalApp) + \")\");\n                    } else if (isTerminalApp > 0) {\n                        throw WouldNotIntegrateError(\"Terminal AppImages should not be integrated\");\n                    }\n\n                    qerr() << \"AppImage should be integrated\" << endl;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/commands/WouldIntegrateCommand.h",
    "content": "#pragma once\n\n// local headers\n#include \"Command.h\"\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            /**\n             * Check whether an AppImage would be integrated.\n             */\n            class WouldIntegrateCommand : public Command {\n                void exec(QList<QString> arguments) final;\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/commands/exceptions.h",
    "content": "#pragma once\n\n// system headers\n#include <stdexcept>\n\n// library headers\n#include <QString>\n\nnamespace appimagelauncher {\n    namespace cli {\n        namespace commands {\n            class CliError : public std::runtime_error {\n            public:\n                explicit CliError(const QString& message) : std::runtime_error(message.toStdString()) {}\n            };\n\n            class CommandNotFoundError : public std::runtime_error {\n            private:\n                QString commandName;\n\n            public:\n                explicit CommandNotFoundError(const QString& commandName) : std::runtime_error(\n                        \"No such command available: \" + commandName.toStdString()), commandName(commandName) {}\n\n                QString getCommandName() const {\n                    return commandName;\n                }\n            };\n\n            class UsageError : public CliError {\n            public:\n                using CliError::CliError;\n            };\n\n            class InvalidArgumentsError : public UsageError {\n            public:\n                using UsageError::UsageError;\n            };\n\n            class WouldNotIntegrateError : public CliError {\n            public:\n                using CliError::CliError;\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/logging/CMakeLists.txt",
    "content": "add_library(cli_logging INTERFACE)\nset_property(TARGET cli_logging PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})\n"
  },
  {
    "path": "src/cli/logging/logging.h",
    "content": "#pragma once\n\n// system headers\n#include <string.h>\n\n// library headers\n#include <QTextStream>\n#include <QDebug>\n\n// wrapper for stdout\n#define qout() QTextStream(stdout, QIODevice::WriteOnly)\n\n// wrapper for stderr\n#define qerr() QTextStream(stderr, QIODevice::WriteOnly)\n"
  },
  {
    "path": "src/daemon/CMakeLists.txt",
    "content": "# daemon binary\nadd_executable(appimagelauncherd main.cpp daemon.cpp worker.cpp)\ntarget_link_libraries(appimagelauncherd shared filesystemwatcher PkgConfig::glib libappimage)\nset_target_properties(appimagelauncherd PROPERTIES INSTALL_RPATH ${_rpath})\n\ninstall(\n    TARGETS appimagelauncherd\n    RUNTIME DESTINATION ${_bindir} COMPONENT APPIMAGELAUNCHER\n    LIBRARY DESTINATION ${_libdir} COMPONENT APPIMAGELAUNCHER\n)\n"
  },
  {
    "path": "src/daemon/daemon.cpp",
    "content": "// STL headers\n#include <chrono>\n\n// library headers\n#include <QDirIterator>\n\n// local headers\n#include \"daemon.h\"\n#include \"shared.h\"\n#include \"appimage/appimage.h\"\n\nusing namespace std::chrono_literals;\n\n#define UPDATE_WATCHED_DIRECTORIES_INTERVAL 30s\n\nnamespace appimagelauncher::daemon {\n\n    Q_LOGGING_CATEGORY(daemonCat, \"appimagelauncher.daemon\")\n\n    Daemon::Daemon(QObject* parent) : QObject(parent), _settings(getConfig(this)), _worker(new Worker(this)),\n                                      _watcher(new FileSystemWatcher(this)), _updateWatchedDirsTimer(new QTimer(this)) {\n        // when we update the watched directories, the file system watcher can calculate whether there's new directories\n        // to watch these\n        QObject::connect(_watcher, &FileSystemWatcher::newDirectoriesToWatch, this, [this](const QDirSet& newDirs) {\n            if (newDirs.empty()) {\n                qCDebug(daemonCat) << \"No new directories to watch detected\";\n            } else {\n                qCInfo(daemonCat) << \"Discovered new directories to watch, integrating existing AppImages initially\";\n\n                initialSearchForAppImages(newDirs);\n\n                // (re-)integrate all AppImages at once\n                _worker->executeDeferredOperations();\n            }\n        });\n\n\n        // whenever a formerly watched directory disappears, we want to clean the menu from entries pointing to AppImages\n        // in this directory\n        // a good example for this situation is a removable drive that has been unplugged from the computer\n        QObject::connect(_watcher, &FileSystemWatcher::directoriesToWatchDisappeared, this, [](const QDirSet& disappearedDirs) {\n             if (disappearedDirs.empty()) {\n                 qCDebug(daemonCat) << \"No directories disappeared\";\n             } else {\n                 qCInfo(daemonCat) << \"Directories to watch disappeared, unintegrating AppImages formerly found in there\";\n\n                 if (!cleanUpOldDesktopIntegrationResources(true)) {\n                     qCCritical(daemonCat) << \"Error: Failed to clean up old desktop integration resources\";\n                 }\n             }\n         });\n\n        // (re-)integrate all AppImages at once\n        _worker->executeDeferredOperations();\n\n        _updateWatchedDirsTimer->setInterval(UPDATE_WATCHED_DIRECTORIES_INTERVAL);\n        connect(\n            _updateWatchedDirsTimer, &QTimer::timeout, this,[this]() {\n                _watcher->updateWatchedDirectories(this->watchedDirectories());\n            }\n        );\n        _updateWatchedDirsTimer->start();\n\n\n        connect(_watcher, &FileSystemWatcher::fileChanged, _worker, &Worker::scheduleForIntegration,\n                Qt::QueuedConnection);\n        connect(_watcher, &FileSystemWatcher::fileRemoved, _worker, &Worker::scheduleForUnintegration,\n               Qt::QueuedConnection);\n    }\n\n    QDirSet Daemon::watchedDirectories() const {\n        return daemonDirectoriesToWatch(_settings);\n    }\n\n\n    void Daemon::initialSearchForAppImages(const QDirSet& dirsToSearch) {\n        // initial search for AppImages; if AppImages are found, they will be integrated, unless they already are\n        qCInfo(daemonCat) << \"Searching for existing AppImages\";\n\n        if (dirsToSearch.empty()) {\n            qCWarning(daemonCat) << \"No directories to search provided initially, skipping\";\n            return;\n        }\n\n        for (const auto& dir : dirsToSearch) {\n            if (!dir.exists()) {\n                qCDebug(daemonCat) << \"Directory \" << dir.path() << \" does not exist, skipping\";\n                continue;\n            }\n\n            qCInfo(daemonCat) << \"Searching directory: \" << dir.absolutePath();\n\n            for (QDirIterator it(dir); it.hasNext();) {\n                const auto& path = it.next();\n\n                if (QFileInfo(path).isFile()) {\n                    const auto appImageType = appimage_get_type(path.toStdString().c_str(), false);\n                    const auto isAppImage = 0 < appImageType && appImageType <= 2;\n\n                    if (isAppImage) {\n                        // at application startup, we don't want to integrate AppImages that have been integrated already,\n                        // as that it slows down very much\n                        // the integration will be updated as soon as any of these AppImages is run with AppImageLauncher\n                        qCInfo(daemonCat) << \"Found AppImage: \" << path;\n\n                        if (!appimage_is_registered_in_system(path.toStdString().c_str())) {\n                            qCInfo(daemonCat) << \"AppImage is not integrated yet, integrating\";\n                            _worker->scheduleForIntegration(path);\n                        } else if (!desktopFileHasBeenUpdatedSinceLastUpdate(path)) {\n                            qCInfo(daemonCat) << \"AppImage has been integrated already but needs to be reintegrated\";\n                            _worker->scheduleForIntegration(path);\n                        } else {\n                            qCInfo(daemonCat) << \"AppImage integrated already, skipping\";\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    bool Daemon::startWatching() {\n        // make sure the watched directories list is up to date\n        _watcher->updateWatchedDirectories(watchedDirectories());\n\n        // search directories to watch once initially\n        // we *have* to do this even though we connect this signal above, as the first update occurs in the constructor\n        // and we cannot connect signals before construction has finished for obvious reasons\n        initialSearchForAppImages(_watcher->directories());\n\n        return _watcher->startWatching();\n    }\n\n    void Daemon::slotStopWatching() {\n        _watcher->stopWatching();\n    }\n\n}\n"
  },
  {
    "path": "src/daemon/daemon.h",
    "content": "#pragma once\n\n// library headers\n#include <QObject>\n#include <QSettings>\n#include <QTimer>\n#include <QLoggingCategory>\n\n// local headers\n#include \"worker.h\"\n#include \"types.h\"\n#include \"filesystemwatcher.h\"\n\nnamespace appimagelauncher::daemon {\n\n    Q_DECLARE_LOGGING_CATEGORY(daemonCat)\n\n    class Daemon : public QObject {\n        Q_OBJECT\n\n    public:\n        explicit Daemon(QObject* parent = nullptr);\n        QDirSet watchedDirectories() const;\n        bool startWatching();\n\n    public slots:\n        void slotStopWatching();\n\n    private:\n        void initialSearchForAppImages(const QDirSet& dirsToSearch);\n\n        QSettings *_settings;\n        Worker* _worker;\n        FileSystemWatcher *_watcher;\n\n        QTimer* _updateWatchedDirsTimer;\n    };\n\n} // namespace\n"
  },
  {
    "path": "src/daemon/main.cpp",
    "content": "// system includes\n#include <deque>\n#include <iostream>\n#include <sstream>\n#include <sys/stat.h>\n\n// library includes\n#include <QCommandLineParser>\n#include <QCoreApplication>\n#include <QDebug>\n#include <QDirIterator>\n#include <QTimer>\n#include <appimage/appimage.h>\n\n// local includes\n#include \"shared.h\"\n#include \"daemon.h\"\n\nusing namespace appimagelauncher::daemon;\n\n/**\n * Read the modification time of the file pointed by <filePath>\n * @param filePath\n * @return file modification time\n */\nlong readFileModificationTime(char* filePath) {\n    struct stat attrib = {0x0};\n    stat(filePath, &attrib);\n    return attrib.st_ctime;\n}\n\n/**\n * Monitors whether the application binary has changed since the process was started. In such case the application\n * is restarted.\n *\n * @param argv\n */\nQTimer* setupBinaryUpdatesMonitor(char* const* argv) {\n    auto* timer = new QTimer();\n    // It's used to restart the daemon if the binary changes\n    static const long binaryModificationTime = readFileModificationTime(argv[0]);\n\n    // callback to compare and restart the app if the binary changed since it was started\n    QObject::connect(timer, &QTimer::timeout, [argv]() {\n        long newBinaryModificationTime = readFileModificationTime(argv[0]);\n        if (newBinaryModificationTime != binaryModificationTime) {\n            std::cerr << \"Binary file changed since the applications was started, proceeding to restart it.\"\n                      << std::endl;\n            execv(argv[0], argv);\n        }\n    });\n\n    // check every 5 min\n    timer->setInterval(5 * 60 * 1000);\n    return timer;\n}\n\n\nint main(int argc, char* argv[]) {\n    // make sure shared won't try to use the UI\n    setenv(\"_FORCE_HEADLESS\", \"1\", 1);\n\n    // improve default logging format\n    qSetMessagePattern(\"[%{type}] %{category}: %{message}\");\n\n    QCommandLineParser parser;\n    parser.setApplicationDescription(\n        QObject::tr(\n            \"Tracks AppImages in applications directories (user's, system and other ones). \"\n            \"Automatically integrates AppImages moved into those directories and unintegrates ones removed from them.\"\n        )\n    );\n\n    QCommandLineOption listWatchedDirectoriesOption(\n        \"list-watched-directories\",\n        QObject::tr(\"Lists directories watched by this daemon and exit\")\n    );\n\n    if (!parser.addOption(listWatchedDirectoriesOption)) {\n        throw std::runtime_error(\"could not add Qt command line option for some reason\");\n    }\n\n    QCommandLineOption debugOption(\n        \"debug\",\n        QObject::tr(\"Enable debug logging\")\n    );\n\n    if (!parser.addOption(debugOption)) {\n        throw std::runtime_error(\"could not add Qt command line option for some reason\");\n    }\n\n    QCoreApplication app(argc, argv);\n\n    {\n        std::ostringstream version;\n        version << \"version \" << APPIMAGELAUNCHER_VERSION << \" \"\n                << \"(git commit \" << APPIMAGELAUNCHER_GIT_COMMIT << \"), built on \"\n                << APPIMAGELAUNCHER_BUILD_DATE;\n        QCoreApplication::setApplicationVersion(QString::fromStdString(version.str()));\n    }\n\n    // parse arguments\n    parser.process(app);\n\n    if (!parser.isSet(debugOption)) {\n        QLoggingCategory::setFilterRules(\"*.debug=false\");\n    } else {\n        QLoggingCategory::setFilterRules(\"*.debug=true\");\n    }\n\n    auto* daemon = new Daemon(&app);\n\n    // this option is for debugging the\n    if (parser.isSet(listWatchedDirectoriesOption)) {\n        for (const auto& watchedDir : daemon->watchedDirectories()) {\n            std::cout << watchedDir.absolutePath().toStdString() << std::endl;\n        }\n        return 0;\n    }\n\n    // after (re-)integrating all AppImages, clean up old desktop integration resources before start\n    if (!cleanUpOldDesktopIntegrationResources()) {\n        std::cout << \"Failed to clean up old desktop integration resources\" << std::endl;\n    }\n\n    qInfo() << \"Watching directories:\" << daemon->watchedDirectories();\n\n    if (!daemon->startWatching()) {\n        std::cerr << \"Could not start watching directories\" << std::endl;\n        return 1;\n    }\n\n    QCoreApplication::connect(&app, &QCoreApplication::aboutToQuit, daemon, &Daemon::slotStopWatching);\n\n    auto* binaryUpdatesMonitor = setupBinaryUpdatesMonitor(argv);\n    binaryUpdatesMonitor->start();\n\n    return QCoreApplication::exec();\n}\n"
  },
  {
    "path": "src/daemon/worker.cpp",
    "content": "// system includes\n#include <atomic>\n#include <iostream>\n#include <deque>\n\n// library includes\n#include <QDebug>\n#include <QFile>\n#include <QObject>\n#include <QSysInfo>\n#include <QTimer>\n#include <QThreadPool>\n#include <QMutexLocker>\n#include <appimage/appimage.h>\n\n// local includes\n#include \"worker.h\"\n#include \"shared.h\"\n\nnamespace {\n\n    enum OP_TYPE {\n        INTEGRATE = 0,\n        UNINTEGRATE = 1,\n    };\n\n    typedef std::pair<QString, OP_TYPE> Operation;\n\n}\n\nnamespace appimagelauncher::daemon {\n\n    Q_LOGGING_CATEGORY(workerCat, \"appimagelauncher.daemon.worker\")\n\n    class Worker::PrivateData {\n    public:\n        QTimer deferredOperationsTimer;\n\n        static constexpr int TIMEOUT = 15 * 1000;\n\n        // std::set is unordered, therefore using std::deque to keep the order of the operations\n        std::deque<Operation> deferredOperations;\n\n        class OperationTask : public QRunnable {\n        private:\n            Operation operation;\n            QMutex* mutex;\n\n        public:\n            OperationTask(const Operation& operation, QMutex* mutex) : operation(operation), mutex(mutex) {}\n\n            void run() override {\n                const auto& path = operation.first;\n                const auto& type = operation.second;\n\n                const auto exists = QFile::exists(path);\n                const auto appImageType = appimage_get_type(path.toStdString().c_str(), false);\n                const auto isAppImage = 0 < appImageType && appImageType <= 2;\n\n                if (type == INTEGRATE) {\n                    {   // Scope for Output Mutex Locker\n                        QMutexLocker mutexLocker(mutex);\n                        std::cout << \"Integrating: \" << path.toStdString() << std::endl;\n\n                        if (!exists) {\n                            std::cout << \"ERROR: file does not exist, cannot integrate\" << std::endl;\n                            return;\n                        }\n\n                        if (!isAppImage) {\n                            std::cout << \"ERROR: not an AppImage, skipping\" << std::endl;\n                            return;\n                        }\n                    }\n\n                    // check for X-AppImage-Integrate=false\n                    if (appimage_shall_not_be_integrated(path.toStdString().c_str())) {\n                        QMutexLocker mutexLocker(mutex);\n                        std::cout << \"WARNING: AppImage shall not be integrated, skipping\" << std::endl;\n                        return;\n                    }\n\n                    if (!installDesktopFileAndIcons(path)) {\n                        QMutexLocker mutexLocker(mutex);\n                        std::cout << \"ERROR: Failed to register AppImage in system\" << std::endl;\n                        return;\n                    }\n                } else if (type == UNINTEGRATE) {\n                    // nothing to do\n                }\n            }\n        };\n\n    public:\n        PrivateData() {\n            deferredOperationsTimer.setSingleShot(true);\n            deferredOperationsTimer.setInterval(TIMEOUT);\n        }\n\n    public:\n        // in addition to a simple duplicate check, this function is context sensitive\n        // it starts with the last element, and checks for duplicates until an opposite action is found\n        // for instance, when the element shall integrated, it will check for duplicates until an unintegration operation\n        // is found\n        bool isDuplicate(Operation operation) {\n            for (auto it = deferredOperations.rbegin(); it != deferredOperations.rend(); ++it) {\n                if ((*it).first == operation.first) {\n                    // if operation type is different, then the operation is new, and should be added to the list\n                    // if it is equal, it's a duplicate\n                    // in either case, the loop can be aborted here\n                    return (*it).second == operation.second;\n                }\n            }\n\n            return false;\n        }\n    };\n\n    Worker::Worker(QObject* parent) : QObject(parent) {\n        d = std::make_shared<PrivateData>();\n\n        connect(this, &Worker::startTimer, this, &Worker::startTimerIfNecessary, Qt::QueuedConnection);\n        connect(&d->deferredOperationsTimer, &QTimer::timeout, this, &Worker::executeDeferredOperations);\n    }\n\n    void Worker::executeDeferredOperations() {\n        if (d->deferredOperations.empty()) {\n            qCDebug(workerCat) << \"No deferred operations to execute\";\n            return;\n        }\n\n        std::cout << \"Executing deferred operations\" << std::endl;\n\n        QMutex outputMutex;\n\n        while (!d->deferredOperations.empty()) {\n            auto operation = d->deferredOperations.front();\n            d->deferredOperations.pop_front();\n            QThreadPool::globalInstance()->start(new PrivateData::OperationTask(operation, &outputMutex));\n        }\n\n        // wait until all AppImages have been integrated\n        QThreadPool::globalInstance()->waitForDone();\n\n        std::cout << \"Cleaning up old desktop integration files\" << std::endl;\n        if (!cleanUpOldDesktopIntegrationResources(true)) {\n            std::cout << \"Failed to clean up old desktop integration files\" << std::endl;\n        }\n\n        // make sure the icons in the launcher are refreshed\n        std::cout << \"Updating desktop database and icon caches\" << std::endl;\n        if (!updateDesktopDatabaseAndIconCaches())\n            std::cout << \"Failed to update desktop database and icon caches\" << std::endl;\n\n        std::cout << \"Done\" << std::endl;\n    }\n\n    void Worker::scheduleForIntegration(const QString& path) {\n        auto operation = std::make_pair(path, INTEGRATE);\n        if (!d->isDuplicate(operation)) {\n            std::cout << \"Scheduling for (re-)integration: \" << path.toStdString() << std::endl;\n            d->deferredOperations.push_back(operation);\n            emit startTimer();\n        }\n\n    }\n\n    void Worker::scheduleForUnintegration(const QString& path) {\n        auto operation = std::make_pair(path, UNINTEGRATE);\n        if (!d->isDuplicate(operation)) {\n            std::cout << \"Scheduling for unintegration: \" << path.toStdString() << std::endl;\n            d->deferredOperations.push_back(operation);\n            emit startTimer();\n        }\n    }\n\n    void Worker::startTimerIfNecessary() {\n        if (!d->deferredOperationsTimer.isActive())\n            QMetaObject::invokeMethod(&d->deferredOperationsTimer, \"start\");\n    }\n\n}\n"
  },
  {
    "path": "src/daemon/worker.h",
    "content": "// system includes\n#include <memory>\n\n// library includes\n#include <QObject>\n#include <QLoggingCategory>\n\n#pragma once\n\nnamespace appimagelauncher::daemon {\n\n    Q_DECLARE_LOGGING_CATEGORY(workerCat)\n\n    class Worker : public QObject {\n        Q_OBJECT\n\n    private:\n        class PrivateData;\n        std::shared_ptr<PrivateData> d = nullptr;\n\n    public:\n        explicit Worker(QObject* parent = nullptr);\n\n    signals:\n        void startTimer();\n\n    public slots:\n        void scheduleForIntegration(const QString& path);\n        void scheduleForUnintegration(const QString& path);\n\n    public slots:\n        void executeDeferredOperations();\n\n    private slots:\n        void startTimerIfNecessary();\n    };\n\n}\n"
  },
  {
    "path": "src/fswatcher/CMakeLists.txt",
    "content": "add_library(filesystemwatcher STATIC filesystemwatcher.cpp filesystemwatcher.h)\ntarget_link_libraries(filesystemwatcher PUBLIC Qt5::Core shared)\ntarget_include_directories(filesystemwatcher PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})\n"
  },
  {
    "path": "src/fswatcher/filesystemwatcher.cpp",
    "content": "// system includes\n#include <iostream>\n#include <map>\n#include <unistd.h>\n\n// library includes\n#include <QDir>\n#include <QMutex>\n#include <QTimer>\n#include <QThread>\n#include <sys/inotify.h>\n\n// local includes\n#include \"filesystemwatcher.h\"\n\nnamespace {\n\n    class INotifyEvent {\n    public:\n        uint32_t mask;\n        QString path;\n\n    public:\n        INotifyEvent(uint32_t mask, QString path) : mask(mask), path(std::move(path)) {}\n    };\n\n}\n\n\nnamespace appimagelauncher::daemon {\n\n    Q_LOGGING_CATEGORY(fswCat, \"appimagelauncher.daemon.filesystemwatcher\")\n\n    class FileSystemWatcher::PrivateData {\n    public:\n        enum EVENT_TYPES {\n            // events that indicate file creations, modifications etc.\n            fileChangeEvents = IN_CLOSE_WRITE | IN_MOVE,\n            // events that indicate a file removal from a directory, e.g., deletion or moving to another location\n            fileRemovalEvents = IN_DELETE | IN_MOVED_FROM,\n        };\n\n        // tracks whether the watcher is running\n        bool isRunning;\n\n    public:\n        QDirSet watchedDirectories;\n        QTimer eventsLoopTimer;\n        QMutex* mutex;\n\n    private:\n        int inotifyFd = -1;\n        std::map<int, QDir> watchFdMap;\n\n    public:\n        // reads events from the inotify fd and emits the correct signals\n        std::vector<INotifyEvent> readEventsFromFd() {\n            // we don't want to read events in parallel\n            QMutexLocker lock{mutex};\n\n            // read raw bytes into buffer\n            // this is necessary, as the inotify_events have dynamic sizes\n            static const auto bufSize = 4096;\n            char buffer[bufSize] __attribute__ ((aligned(8)));\n\n            const auto rv = read(inotifyFd, buffer, bufSize);\n            const auto error = errno;\n\n            if (rv == 0) {\n                throw FileSystemWatcherError(\"read() on inotify FD must never return 0\");\n            }\n\n            if (rv == -1) {\n                // we're using a non-blocking inotify fd, therefore, if errno is set to EAGAIN, we just didn't find any\n                // new events\n                // this is not an error case\n                if (error == EAGAIN)\n                    return {};\n\n                throw FileSystemWatcherError(QString(\"Failed to read from inotify fd: \") + strerror(error));\n            }\n\n            // read events into vector\n            std::vector<INotifyEvent> events;\n\n            for (char* p = buffer; p < buffer + rv;) {\n                // create inotify_event from current position in buffer\n                auto* currentEvent = (struct inotify_event*) p;\n\n                // initialize new INotifyEvent with the data from the currentEvent\n                QString relativePath(currentEvent->name);\n                auto directory = watchFdMap[currentEvent->wd];\n                events.emplace_back(currentEvent->mask, directory.absolutePath() + \"/\" + relativePath);\n\n                // update current position in buffer\n                p += sizeof(struct inotify_event) + currentEvent->len;\n            }\n\n            return events;\n        }\n\n        PrivateData() : isRunning(false), watchedDirectories(), mutex(new QMutex) {\n            inotifyFd = inotify_init1(IN_NONBLOCK);\n\n            if (inotifyFd < 0) {\n                auto error = errno;\n                throw FileSystemWatcherError(QString(\"Failed to initialize inotify, reason: \") + strerror(error));\n            }\n        };\n\n        // caution: method is not threadsafe!\n        bool startWatching(const QDir& directory) {\n            static const auto mask = fileChangeEvents | fileRemovalEvents;\n\n            qCDebug(fswCat) << \"start watching directory \" << directory;\n\n            if (!directory.exists()) {\n                qCDebug(fswCat) << \"Warning: directory \" << directory.absolutePath() << \" does not exist, skipping\";\n                return true;\n            }\n\n            const int watchFd = inotify_add_watch(inotifyFd, directory.absolutePath().toStdString().c_str(), mask);\n\n            if (watchFd == -1) {\n                const auto error = errno;\n                qCCritical(fswCat) << \"Failed to start watching: \" << strerror(error);\n                return false;\n            }\n\n            watchFdMap[watchFd] = directory;\n            eventsLoopTimer.start();\n\n            return true;\n        }\n\n        bool startWatching() {\n            QMutexLocker lock{mutex};\n\n            for (const auto& directory: watchedDirectories) {\n                if (!startWatching(directory))\n                    return false;\n            }\n\n            return true;\n        }\n\n        bool startWatching(const QDirSet& directories) {\n            QMutexLocker lock{mutex};\n\n            for (const auto& directory: directories) {\n                if (!startWatching(directory)) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        // caution: method is not threadsafe!\n        bool stopWatching(int watchFd) {\n            // no matter whether the watch removal succeeds, retrying to remove the watch won't help\n            // therefore, we can remove the file descriptor from the map in any case\n            watchFdMap.erase(watchFd);\n\n            qCDebug(fswCat) << \"stop watching watchfd \" << watchFd;\n\n            if (inotify_rm_watch(inotifyFd, watchFd) == -1) {\n                const auto error = errno;\n                qCCritical(fswCat) << \"Failed to stop watching: \" << strerror(error);\n                return false;\n            }\n\n            return true;\n        }\n\n        bool stopWatching() {\n            QMutexLocker lock{mutex};\n\n            while (!watchFdMap.empty()) {\n                const auto pair = *(watchFdMap.begin());\n                const auto watchFd = pair.first;\n\n                if (!stopWatching(watchFd)) {\n                    qCCritical(fswCat) << \"Warning: Failed to stop watching on file descriptor \" << watchFd;\n                }\n            }\n\n            return true;\n        }\n\n        bool stopWatching(const QDirSet& directories) {\n            QMutexLocker lock{mutex};\n\n            for (const auto& directory: directories) {\n                for (const auto& pair: watchFdMap) {\n                    if (pair.second == directory) {\n                        if (!stopWatching(pair.first)) {\n                            return false;\n                        }\n                    }\n                }\n\n                // reaching the following line means that we couldn't find the requested path in the fd map\n                return false;\n            }\n\n            return true;\n        }\n    };\n\n    FileSystemWatcher::FileSystemWatcher(QObject* parent) : QObject(parent) {\n        d = std::make_shared<PrivateData>();\n\n        d->eventsLoopTimer.setInterval(100);\n        connect(&d->eventsLoopTimer, &QTimer::timeout, this, &FileSystemWatcher::readEvents);\n    }\n\n    FileSystemWatcher::FileSystemWatcher(const QDir& path, QObject* parent) : FileSystemWatcher(parent) {\n        updateWatchedDirectories(QDirSet{{path}});\n    }\n\n    FileSystemWatcher::FileSystemWatcher(const QDirSet& paths, QObject* parent) : FileSystemWatcher(parent) {\n        updateWatchedDirectories(paths);\n    }\n\n    QDirSet FileSystemWatcher::directories() {\n        QMutexLocker lock{d->mutex};\n\n        return d->watchedDirectories;\n    }\n\n    bool FileSystemWatcher::startWatching() {\n        {\n            QMutexLocker lock{d->mutex};\n\n            if (d->isRunning) {\n                qCDebug(fswCat) << \"tried to start file system watcher while it's running already\";\n                return true;\n            }\n        }\n\n        auto rv = d->startWatching();\n\n        {\n            QMutexLocker lock{d->mutex};\n\n            if (rv)\n                d->isRunning = true;\n        }\n\n        return rv;\n    }\n\n    bool FileSystemWatcher::stopWatching() {\n        {\n            QMutexLocker lock{d->mutex};\n\n            if (!d->isRunning) {\n                qCDebug(fswCat) << \"tried to stop file system watcher while stopped\";\n                return true;\n            }\n        }\n\n        const auto rv = d->stopWatching();\n\n        {\n            QMutexLocker lock{d->mutex};\n\n            if (rv) {\n                d->isRunning = false;\n\n                // we can stop reporting events now, I guess\n                d->eventsLoopTimer.stop();\n            }\n        }\n\n        return rv;\n    }\n\n    void FileSystemWatcher::readEvents() {\n        auto events = d->readEventsFromFd();\n\n        for (const auto& event: events) {\n            const auto mask = event.mask;\n\n            if (mask & d->fileChangeEvents) {\n                emit fileChanged(event.path);\n            } else if (mask & d->fileRemovalEvents) {\n                emit fileRemoved(event.path);\n            }\n        }\n    }\n\n    bool FileSystemWatcher::updateWatchedDirectories(QDirSet watchedDirectories) {\n        // the list may contain entries for directories which don't exist already, therefore we have to remove those first\n        // so when they'll be created, we'll notice\n        {\n            // erase-remove doesn't work with sets apparently (see https://stackoverflow.com/a/26833313)\n            // therefore we use a simple linear search to remove non-existing directories\n            for (auto it = watchedDirectories.begin(); it != watchedDirectories.end(); ++it) {\n                if (!it->exists()) {\n                    qCDebug(fswCat) << \"Directory \" << it->path() << \" does not exist, skipping\";\n                    it = watchedDirectories.erase(it);\n                }\n            }\n        }\n\n        auto setDifference = [](const QDirSet& toExamine, const QDirSet& toSearchFor) -> QDirSet {\n            QDirSet results;\n\n            // QDir behaves weirdly with STL algorithm comparisons etc.\n            // therefore we implement this difference algorithm all by ourselves to make sure it works correctly\n            for (const auto& examined: toExamine) {\n                bool found = false;\n\n                for (const auto& searched: toSearchFor) {\n                    if (searched == examined) {\n                        found = true;\n                        break;\n                    }\n                }\n\n                if (!found) {\n                    results.insert(examined);\n                }\n            }\n\n            return results;\n        };\n\n        // first, we calculate which directores are new to be watched\n        QDirSet newDirectories = setDifference(watchedDirectories, d->watchedDirectories);\n\n        // to stop watching with a fine granularity, we also need to know which directories have been removed\n        QDirSet disappearedDirectories = setDifference(d->watchedDirectories, watchedDirectories);\n\n        {\n            QMutexLocker lock{d->mutex};\n\n            // now we can update the internal state\n            d->watchedDirectories = watchedDirectories;\n\n            // if the watching hasn't been started yet, we shouldn't start/stop any watches\n            // unfortunately we need an extra variable to track this...\n            if (!d->isRunning)\n                return true;\n        }\n\n        // we must run both stop and start methods, so we cannot directly return false if either fails\n        // also, this makes sure the signals are sent even in case either of the following methods fails\n        bool rv = true;\n        rv = rv && d->stopWatching(disappearedDirectories);\n        rv = rv && d->startWatching(newDirectories);\n\n        // send out the signals for further handling by users of a fs watcher instance\n        emit newDirectoriesToWatch(newDirectories);\n        emit directoriesToWatchDisappeared(disappearedDirectories);\n\n        return rv;\n    }\n\n}\n"
  },
  {
    "path": "src/fswatcher/filesystemwatcher.h",
    "content": "// system includes\n#include <algorithm>\n#include <memory>\n#include <unordered_set>\n\n// library includes\n#include <QDir>\n#include <QObject>\n#include <QLoggingCategory>\n#include <QSet>\n#include <QString>\n#include <QThread>\n\n// local includes\n#include \"types.h\"\n\n#pragma once\n\nnamespace appimagelauncher::daemon {\n\n    Q_DECLARE_LOGGING_CATEGORY(fswCat)\n\n    class FileSystemWatcherError : public std::runtime_error {\n    public:\n        explicit FileSystemWatcherError(const QString& message) : std::runtime_error(message.toStdString().c_str()) {};\n    };\n\n    class FileSystemWatcher : public QObject {\n        Q_OBJECT\n\n    private:\n        class PrivateData;\n\n        std::shared_ptr<PrivateData> d;\n\n    public:\n        explicit FileSystemWatcher(const QDir& directory, QObject* parent = nullptr);\n        explicit FileSystemWatcher(const QDirSet& paths, QObject* parent = nullptr);\n        explicit FileSystemWatcher(QObject* parent = nullptr);\n\n    public slots:\n        bool startWatching();\n        bool stopWatching();\n        void readEvents();\n        bool updateWatchedDirectories(QDirSet watchedDirectories);\n\n    public:\n        QDirSet directories();\n\n    signals:\n        void fileChanged(QString path);\n        void fileRemoved(QString path);\n        void newDirectoriesToWatch(QDirSet set);\n        void directoriesToWatchDisappeared(QDirSet set);\n    };\n\n}\n"
  },
  {
    "path": "src/i18n/CMakeLists.txt",
    "content": "add_library(translationmanager translationmanager.cpp translationmanager.h)\ntarget_link_libraries(translationmanager PUBLIC Qt5::Core Qt5::Widgets shared)\ntarget_include_directories(translationmanager PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})\nadd_dependencies(translationmanager l10n)\n"
  },
  {
    "path": "src/i18n/translationmanager.cpp",
    "content": "// system headers\n#include <iostream>\n\n// library headers\n#include <QDebug>\n#include <QDir>\n#include <QLibraryInfo>\n#include <QString>\n\n// local headers\n#include <shared.h>\n#include \"translationmanager.h\"\n\nTranslationManager::TranslationManager(QCoreApplication& app) : app(app) {\n    // set up translations\n    auto qtTranslator = new QTranslator();\n    qtTranslator->load(\"qt_\" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));\n    app.installTranslator(qtTranslator);\n\n    const auto systemLocale = QLocale::system().name();\n\n    // we're using primarily short names for translations, so we should load these translations as well\n    const auto shortSystemLocale = systemLocale.split('_')[0];\n\n    const auto translationDir = getTranslationDir();\n\n    auto myappTranslator = new QTranslator();\n    myappTranslator->load(translationDir + \"/ui.\" + systemLocale + \".qm\");\n    myappTranslator->load(translationDir + \"/ui.\" + shortSystemLocale + \".qm\");\n    app.installTranslator(myappTranslator);\n\n    // store translators in list so they won't be deleted\n    installedTranslators.push_back(qtTranslator);\n    installedTranslators.push_back(myappTranslator);\n}\n\nTranslationManager::~TranslationManager() {\n    for (auto& translator : installedTranslators) {\n        delete translator;\n        translator = nullptr;\n    }\n}\n\nQString TranslationManager::getTranslationDir() {\n    // first we need to find the translation directory\n    // if this is run from the build tree, we try a path that can only work within the build directory\n    // then, we try the expected install location relative to the main binary\n    const auto binaryDirPath = QApplication::applicationDirPath();\n\n    // previously the path to the repo root dir was embedded to allow for finding the compiled translations\n    // this lead to irreproducible builds\n    // therefore the files are now generated within the build dir, and we guess the path based on the binary location\n    auto translationDir = binaryDirPath + \"/../../i18n/generated/l10n\";\n\n    // when the application is installed, we need to look for the files in the private data directory\n    if (!QDir(translationDir).exists()) {\n        auto privateDataDir = pathToPrivateDataDirectory();\n        if (!privateDataDir.isEmpty()) {\n            translationDir = privateDataDir + \"/l10n\";\n        }\n    }\n\n    // give the user (and dev) some feedback whether the translations could actually be found or not\n    if (!QDir(translationDir).exists()) {\n        std::cerr << \"[AppImageLauncher] Warning: \"\n                  << \"Translation directory could not be found, translations are likely not available\" << std::endl;\n    }\n\n    return translationDir;\n}\n"
  },
  {
    "path": "src/i18n/translationmanager.h",
    "content": "#pragma once\n\n// library includes\n#include <QApplication>\n#include <QTranslator>\n#include <QList>\n\n/*\n * Installs translations for AppImageLauncher UIs in a Qt application.\n *\n * You need to keep instances of this alive until the application is terminated.\n */\nclass TranslationManager {\nprivate:\n    const QCoreApplication& app;\n    QList<QTranslator*> installedTranslators;\n\npublic:\n    explicit TranslationManager(QCoreApplication& app);\n    ~TranslationManager();\n\npublic:\n    // get translation dir\n    static QString getTranslationDir();\n};\n"
  },
  {
    "path": "src/shared/CMakeLists.txt",
    "content": "add_library(shared STATIC shared.h shared.cpp types.h types.cpp)\ntarget_link_libraries(shared PUBLIC PkgConfig::glib Qt5::Core Qt5::Widgets Qt5::DBus libappimage translationmanager trashbin)\nif(ENABLE_UPDATE_HELPER)\n    target_link_libraries(shared PUBLIC libappimageupdate)\nendif()\ntarget_compile_definitions(shared\n    PRIVATE -DPRIVATE_LIBDIR=\"${_private_libdir}\"\n    PRIVATE -DCMAKE_PROJECT_SOURCE_DIR=\"${PROJECT_SOURCE_DIR}\"\n)\ntarget_include_directories(shared PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})\n"
  },
  {
    "path": "src/shared/shared.cpp",
    "content": "// system includes\n#include <fstream>\n#include <iostream>\n#include <memory>\n#include <sstream>\n#include <tuple>\nextern \"C\" {\n    #include <appimage/appimage.h>\n    #include <glib.h>\n    // #include <libgen.h>\n    #include <sys/stat.h>\n    #include <stdio.h>\n    #include <unistd.h>\n}\n\n// library includes\n#include <QDebug>\n#include <QIcon>\n#include <QtDBus>\n#include <QDirIterator>\n#include <QJsonDocument>\n#include <QJsonObject>\n#include <QJsonParseError>\n#include <QLibraryInfo>\n#include <QMap>\n#include <QMapIterator>\n#include <QMessageBox>\n#include <QObject>\n#include <QRegularExpression>\n#include <QSet>\n#include <QSettings>\n#include <QStandardPaths>\n#include <QWindow>\n#include <QPushButton>\n#include <QPixmap>\n#ifdef ENABLE_UPDATE_HELPER\n#include <appimage/update.h>\n#endif\n\n// local headers\n#include \"shared.h\"\n#include \"translationmanager.h\"\n\nstatic void gKeyFileDeleter(GKeyFile* ptr) {\n    if (ptr != nullptr)\n        g_key_file_free(ptr);\n}\n\nstatic void gErrorDeleter(GError* ptr) {\n    if (ptr != nullptr)\n        g_error_free(ptr);\n}\n\nbool makeExecutable(const QString& path) {\n    struct stat fileStat{};\n\n    if (stat(path.toStdString().c_str(), &fileStat) != 0) {\n        std::cerr << \"Failed to call stat() on \" << path.toStdString() << std::endl;\n        return false;\n    }\n\n    // no action required when file is executable already\n    // this could happen in scenarios when an AppImage is in a read-only location\n    if ((fileStat.st_uid == getuid() && fileStat.st_mode & 0100) ||\n        (fileStat.st_gid == getgid() && fileStat.st_mode & 0010) ||\n        (fileStat.st_mode & 0001)) {\n        return true;\n    }\n\n    return chmod(path.toStdString().c_str(), fileStat.st_mode | 0111) == 0;\n}\n\nbool makeNonExecutable(const QString& path) {\n    struct stat fileStat{};\n\n    if (stat(path.toStdString().c_str(), &fileStat) != 0) {\n        std::cerr << \"Failed to call stat() on \" << path.toStdString() << std::endl;\n        return false;\n    }\n\n    auto permissions = fileStat.st_mode;\n\n    // remove executable permissions\n    for (const auto permPart : {0100, 0010, 0001}) {\n        if (permissions & permPart)\n            permissions -= permPart;\n    }\n\n    return chmod(path.toStdString().c_str(), permissions) == 0;\n}\n\nQString expandTilde(QString path) {\n    if ((path.size() == 1 && path[0] == '~') || (path.size() >= 2 && path.startsWith(\"~/\"))) {\n        path.remove(0, 1);\n        path.prepend(QDir::homePath());\n    }\n\n    return path;\n}\n\n// calculate path to config file\nQString getConfigFilePath() {\n    const auto configPath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);\n    const auto configFilePath = configPath + \"/appimagelauncher.cfg\";\n    return configFilePath;\n}\n\nvoid createConfigFile(int askToMove,\n                      const QString& destination,\n                      int enableDaemon,\n                      const QStringList& additionalDirsToWatch,\n                      int monitorMountedFilesystems) {\n    auto configFilePath = getConfigFilePath();\n\n    QFile file(configFilePath);\n    file.open(QIODevice::WriteOnly);\n\n    // cannot use QSettings because it doesn't support comments\n    // let's do it manually and hope for the best\n    file.write(\"[AppImageLauncher]\\n\");\n\n    if (askToMove < 0) {\n        file.write(\"# ask_to_move = true\\n\");\n    } else {\n        file.write(\"ask_to_move = \");\n        if (askToMove == 0) {\n            file.write(\"false\");\n        } else {\n            file.write(\"true\");\n        }\n        file.write(\"\\n\");\n    }\n\n    if (destination.isEmpty()) {\n        file.write(\"# destination = ~/Applications\\n\");\n    } else {\n        file.write(\"destination = \");\n        file.write(destination.toUtf8());\n        file.write(\"\\n\");\n    }\n\n    if (enableDaemon < 0) {\n        file.write(\"# enable_daemon = true\\n\");\n    } else {\n        file.write(\"enable_daemon = \");\n        if (enableDaemon == 0) {\n            file.write(\"false\");\n        } else {\n            file.write(\"true\");\n        }\n        file.write(\"\\n\");\n    }\n\n    file.write(\"\\n\\n\");\n\n    // daemon configs\n    file.write(\"[appimagelauncherd]\\n\");\n\n    if (additionalDirsToWatch.empty()) {\n        file.write(\"# additional_directories_to_watch = ~/otherApplications:/even/more/applications\\n\");\n    } else {\n        file.write(\"additional_directories_to_watch = \");\n        file.write(additionalDirsToWatch.join(':').toUtf8());\n        file.write(\"\\n\");\n    }\n\n    if (monitorMountedFilesystems < 0) {\n        file.write(\"# monitor_mounted_filesystems = false\\n\");\n    } else {\n        file.write(\"monitor_mounted_filesystems = \");\n        if (monitorMountedFilesystems == 0) {\n            file.write(\"false\");\n        } else {\n            file.write(\"true\");\n        }\n        file.write(\"\\n\");\n    }\n}\n\nQSettings* getConfig(QObject* parent) {\n    auto configFilePath = getConfigFilePath();\n\n    auto* settings = new QSettings(configFilePath, QSettings::IniFormat, parent);\n\n    // expand ~ in paths in the config file with $HOME\n    const auto keysContainingPath = {\n        \"AppImageLauncher/destination\",\n    };\n    for (const QString& keyContainingPath : keysContainingPath){\n        if (settings->contains(keyContainingPath)) {\n            auto newValue = expandTilde(settings->value(keyContainingPath).toString());\n            settings->setValue(keyContainingPath, newValue);\n        }\n    }\n\n    return settings;\n}\n\n// TODO: check if this works with Wayland\nbool isHeadless() {\n    bool isHeadless = true;\n\n    // not really clean to abuse env vars as \"global storage\", but hey, it works\n    if (getenv(\"_FORCE_HEADLESS\")) {\n        return true;\n    }\n\n    QProcess proc;\n    proc.setProgram(\"xhost\");\n    proc.setStandardOutputFile(QProcess::nullDevice());\n    proc.setStandardErrorFile(QProcess::nullDevice());\n\n    proc.start();\n    proc.waitForFinished();\n\n    switch (proc.exitCode()) {\n        case 255: {\n            // program not found, using fallback method\n            isHeadless = (getenv(\"DISPLAY\") == nullptr);\n            break;\n        }\n        case 0:\n        case 1:\n            isHeadless = proc.exitCode() == 1;\n            break;\n        default:\n            throw std::runtime_error(\"Headless detection failed: unexpected exit code from xhost\");\n    }\n\n    return isHeadless;\n}\n\n// avoids code duplication, and works for both graphical and non-graphical environments\nvoid displayMessageBox(const QString& title, const QString& message, const QMessageBox::Icon icon) {\n    if (isHeadless()) {\n        std::cerr << title.toStdString() << \": \" << message.toStdString() << std::endl;\n    } else {\n        // little complex, can't use QMessageBox::{critical,warning,...} for the same reason as in main()\n        auto* mb = new QMessageBox(icon, title, message, QMessageBox::Ok, nullptr);\n        mb->show();\n        QApplication::exec();\n    }\n}\n\nvoid displayError(const QString& message) {\n    displayMessageBox(QObject::tr(\"Error\"), message, QMessageBox::Critical);\n}\n\nvoid displayWarning(const QString& message) {\n    displayMessageBox(QObject::tr(\"Warning\"), message, QMessageBox::Warning);\n}\n\nQDir integratedAppImagesDestination() {\n    auto config = getConfig();\n\n    if (config == nullptr)\n        return DEFAULT_INTEGRATION_DESTINATION;\n\n    static const QString keyName(\"AppImageLauncher/destination\");\n    if (config->contains(keyName))\n        return config->value(keyName).toString();\n\n    return DEFAULT_INTEGRATION_DESTINATION;\n}\n\nclass Mount {\nprivate:\n    QString device;\n    QString mountPoint;\n    QString fsType;\n    QString mountOptions;\n\npublic:\n    Mount(QString device, QString mountPoint, QString fsType, QString mountOptions) :\n        device(std::move(device)),\n        mountPoint(std::move(mountPoint)),\n        fsType(std::move(fsType)),\n        mountOptions(std::move(\n        mountOptions)) {}\n\n    Mount(const Mount& other) = default;\n\n    Mount& operator=(const Mount& other) = default;\n\npublic:\n    const QString& getDevice() const {\n        return device;\n    }\n\n    const QString& getMountPoint() const {\n        return mountPoint;\n    }\n\n    const QString& getFsType() const {\n        return fsType;\n    }\n\n    const QString& getMountOptions() const {\n        return mountOptions;\n    }\n};\n\nQList<Mount> listMounts() {\n    QList<Mount> mountedDirectories;\n\n    std::ifstream ifs(\"/proc/mounts\");\n\n    std::string _currentLine;\n    while (std::getline(ifs, _currentLine)) {\n        const auto currentLine = QString::fromStdString(_currentLine);\n\n        const auto parts = currentLine.split(\" \");\n\n        mountedDirectories << Mount{parts[0], parts[1], parts[2], parts[3]};\n    }\n\n    return mountedDirectories;\n}\n\nQSet<QString> additionalAppImagesLocations(const bool includeAllMountPoints) {\n    QSet<QString> additionalLocations;\n\n    additionalLocations << \"/Applications\";\n\n    // integrate AppImages from mounted filesystems, if requested\n    // we don't want to read files from any FUSE mounted filesystems nor from any virtual filesystems\n    // to\n    static const auto validFilesystems = {\"ext2\", \"ext3\", \"ext4\", \"ntfs\", \"vfat\", \"btrfs\"};\n\n    static const auto blacklistedMountPointPrefixes = {\n        \"/var/lib/schroot\",\n        \"/run/docker\",\n        \"/boot\",\n        \"/sys\",\n        \"/proc\",\n        \"/snap\",\n    };\n\n    if (includeAllMountPoints) {\n        for (const auto& mount : listMounts()) {\n            const auto& device = mount.getDevice();\n            const auto& mountPoint = mount.getMountPoint();\n            const auto& fsType = mount.getFsType();\n\n            // we have to filter out virtual filesystems, i.e., ones which have a \"nonsense\" device path\n            // any device that doesn't start with / is likely virtual, this is the first indicator\n            if (device.size() < 1 || device[0] != '/') {\n                continue;\n            }\n\n            // the device should exist for obvious reasons\n            if (!QFileInfo(QFileInfo(device).absoluteFilePath()).exists()) {\n                continue;\n            }\n\n            // we don't want to mount any loop-mounted or bind-mounted or other devices, only... \"native\" ones\n            // therefore we permit only \"real\" devices listed within /dev\n            if (!device.startsWith(\"/dev/\")) {\n                continue;\n            }\n\n            // there's a few locations which we know we don't want to search for AppImages in\n            // either it's a waste of time or otherwise a bad idea, but it will surely save time *not* to search them\n            if (std::find_if(blacklistedMountPointPrefixes.begin(), blacklistedMountPointPrefixes.end(),\n                             [&mountPoint](const QString& prefix) {\n                                 return mountPoint == prefix || mountPoint.startsWith(prefix + \"/\");\n                             }) != blacklistedMountPointPrefixes.end()) {\n                continue;\n            }\n\n            // we can skip the root mount point, as we handled it above\n            if (mountPoint == \"/\") {\n                continue;\n            }\n\n            // we only support a limited set of filesystems\n            if (std::find(validFilesystems.begin(), validFilesystems.end(), fsType) == validFilesystems.end()) {\n                continue;\n            }\n\n            // sanity check -- can likely be removed in the future\n            if (mountPoint.isEmpty()) {\n                const auto message = \"empty mount point for mount with device \" + device.toStdString();\n                throw std::invalid_argument(message);\n            }\n\n            // assemble potential applications location; caller needs to check whether the directory exists before setting\n            // up e.g., an inotify watch\n            const QString additionalLocation(mountPoint + \"/Applications\");\n            additionalLocations << additionalLocation;\n        }\n    }\n\n    return additionalLocations;\n}\n\nbool shallMonitorMountedFilesystems(const QSettings* config) {\n    Q_ASSERT(config != nullptr);\n\n    return config->value(\"appimagelauncherd/monitor_mounted_filesystems\", \"false\").toBool();\n}\n\nQDirSet getAdditionalDirectoriesFromConfig(const QSettings* config) {\n    Q_ASSERT(config != nullptr);\n\n    constexpr auto configKey = \"appimagelauncherd/additional_directories_to_watch\";\n    const auto configValue = config->value(configKey, \"\").toString();\n    qDebug() << configKey << \"value:\" << configValue;\n\n    QDirSet additionalDirs{};\n\n    for (auto dirPath : configValue.split(\":\")) {\n        // empty values will, for some reason, be interpreted as \"use the home directory\"\n        // as we don't want to accidentally monitor the home directory, we need to skip those values\n        if (dirPath.isEmpty()) {\n            qDebug() << \"skipping empty directory path\";\n            continue;\n        }\n\n        // make sure to have full path\n        qDebug() << \"path before tilde expansion:\" << dirPath;\n        dirPath = expandTilde(dirPath);\n        qDebug() << \"path after tilde expansion:\" << dirPath;\n\n        // non-absolute paths which don't contain a tilde cannot be resolved safely, they likley depend on the cwd\n        // therefore, we need to ignore those\n        if (!QFileInfo(dirPath).isAbsolute()) {\n            std::cerr << \"Warning: path \" << dirPath.toStdString() << \" can not be resolved, skipping\" << std::endl;\n            continue;\n        }\n\n        const QDir dir(dirPath);\n\n        if (!dir.exists()) {\n            std::cerr << \"Warning: could not find directory \" << dirPath.toStdString() << \", skipping\" << std::endl;\n            continue;\n        }\n\n        additionalDirs.insert(dir);\n    }\n\n    return additionalDirs;\n}\n\nQDirSet daemonDirectoriesToWatch(const QSettings* config) {\n    QDirSet watchedDirectories;\n\n    // of course we need to watch the main integration directory\n    const auto defaultDestination = integratedAppImagesDestination();\n\n    // make sure it exists, otherwise the daemon doesn't have anything to do\n    if (!defaultDestination.exists()) {\n        defaultDestination.mkdir(\".\");\n    }\n\n    watchedDirectories.insert(defaultDestination);\n\n    // however, there's likely additional ones to watch, like a system-wide Applications directory\n    {\n        bool monitorMountedFilesystems = shallMonitorMountedFilesystems(config);\n\n        const auto additionalDirs = additionalAppImagesLocations(monitorMountedFilesystems);\n\n        for (const auto& d : additionalDirs) {\n            watchedDirectories.insert(QDir(d).absolutePath());\n        }\n    }\n\n    // also, we should include additional directories from the config file\n    {\n        const auto configProvidedDirectories = getAdditionalDirectoriesFromConfig(config);\n\n        std::copy(\n            configProvidedDirectories.begin(), configProvidedDirectories.end(),\n            std::inserter(watchedDirectories, watchedDirectories.end())\n        );\n    }\n\n    return watchedDirectories;\n}\n\nQString buildPathToIntegratedAppImage(const QString& pathToAppImage) {\n    // if type 2 AppImage, we can build a \"content-aware\" filename\n    // see #7 for details\n    auto digest = getAppImageDigestMd5(pathToAppImage);\n\n    const QFileInfo appImageInfo(pathToAppImage);\n\n    QString baseName = appImageInfo.completeBaseName();\n\n    // if digest is available, append a separator\n    if (!digest.isEmpty()) {\n        const auto digestSuffix = \"_\" + digest;\n\n        // check whether digest is already contained in filename\n        if (!pathToAppImage.contains(digestSuffix))\n            baseName += \"_\" + digest;\n    }\n\n    auto fileName = baseName;\n\n    // must not use completeSuffix() in combination with completeBasename(), otherwise the final filename is composed\n    // incorrectly\n    if (!appImageInfo.suffix().isEmpty()) {\n        fileName += \".\" + appImageInfo.suffix();\n    }\n\n    return integratedAppImagesDestination().path() + \"/\" + fileName;\n}\n\nstd::map<std::string, std::string> findCollisions(const QString& currentNameEntry) {\n    std::map<std::string, std::string> collisions{};\n\n    // default locations of desktop files on systems\n    const auto directories = {\n        QString(\"/usr/share/applications/\"),\n        QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + \"/applications/\"\n    };\n\n    for (const auto& directory : directories) {\n        QDirIterator iterator(directory, QDirIterator::FollowSymlinks);\n\n        while (iterator.hasNext()) {\n            const auto filename = iterator.next();\n\n            if (!QFileInfo(filename).isFile() || !filename.endsWith(\".desktop\"))\n                continue;\n\n            std::shared_ptr<GKeyFile> desktopFile(g_key_file_new(), gKeyFileDeleter);\n            std::shared_ptr<GError*> error(nullptr, gErrorDeleter);\n\n            // if the key file parser can't load the file, it's most likely not a valid desktop file, so we just skip this file\n            if (!g_key_file_load_from_file(desktopFile.get(), filename.toStdString().c_str(), G_KEY_FILE_KEEP_TRANSLATIONS, error.get()))\n                continue;\n\n            auto* nameEntry = g_key_file_get_string(desktopFile.get(), G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, error.get());\n\n            // invalid desktop file, needs to be skipped\n            if (nameEntry == nullptr)\n                continue;\n\n            if (QString(nameEntry).trimmed().startsWith(currentNameEntry.trimmed())) {\n                collisions[filename.toStdString()] = nameEntry;\n            }\n        }\n    }\n\n    return collisions;\n}\n\nbool updateDesktopDatabaseAndIconCaches() {\n    const auto dataLocation = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);\n\n    const std::map<std::string, std::string> commands = {\n        {\"update-desktop-database\", dataLocation.toStdString() + \"/applications\"},\n        {\"gtk-update-icon-cache-3.0\", dataLocation.toStdString() + \"/icons/hicolor/ -t\"},\n        {\"gtk-update-icon-cache\", dataLocation.toStdString() + \"/icons/hicolor/ -t\"},\n        {\"xdg-desktop-menu\", \"forceupdate\"},\n        {\"update-mime-database\", dataLocation.toStdString() + \"/mime \"},\n        {\"update-icon-caches\", dataLocation.toStdString() + \"/icons/\"},\n    };\n\n    for (const auto& command : commands) {\n        // only call if the command exists\n        if (system((\"which \" + command.first + \" 2>&1 1>/dev/null\").c_str()) == 0) {\n            // exit codes are not evaluated intentionally\n            system((command.first + \" \" + command.second).c_str());\n        }\n    }\n\n    return true;\n}\n\nstd::shared_ptr<char> getOwnBinaryPath() {\n    auto path = std::shared_ptr<char>(realpath(\"/proc/self/exe\", nullptr));\n\n    if (path == nullptr)\n        throw std::runtime_error(\"Could not detect path to own binary; something must be horribly broken\");\n\n    return path;\n}\n\n#ifndef BUILD_LITE\nQString privateLibDirPath(const QString& srcSubdirName) {\n    // PRIVATE_LIBDIR will be a relative path most likely\n    // therefore, we need to detect the install prefix based on our own binary path, and then calculate the path to\n    // the helper tools based on that\n    const QString ownBinaryDirPath = QFileInfo(getOwnBinaryPath().get()).dir().absolutePath();\n    const QString installPrefixPath = QFileInfo(ownBinaryDirPath).dir().absolutePath();\n    QString privateLibDirPath = installPrefixPath + \"/\" + PRIVATE_LIBDIR;\n\n    // the following lines make things work during development: here, the build dir path is inserted instead, which\n    // allows for testing with the latest changes\n    if (!QDir(privateLibDirPath).exists()) {\n        // this makes sure that when we're running from a local dev build, we end up in the right directory\n        // very important when running this code from the daemon, since it's not in the same directory as the helpers\n        privateLibDirPath = ownBinaryDirPath + \"/../\" + srcSubdirName;\n    }\n\n    // if there is no such directory like <prefix>/bin/../lib/... or the binary is not found there, there is a chance\n    // the binary is just next to this one (this is the case in the update/remove helpers)\n    // therefore we compare the binary directory path with PRIVATE_LIBDIR\n    if (!QDir(privateLibDirPath).exists()) {\n        if (privateLibDirPath.contains(PRIVATE_LIBDIR)) {\n            privateLibDirPath = ownBinaryDirPath;\n        }\n    }\n\n    return privateLibDirPath;\n}\n#endif\n\nbool installDesktopFileAndIcons(const QString& pathToAppImage, bool resolveCollisions) {\n    if (appimage_register_in_system(pathToAppImage.toStdString().c_str(), false) != 0) {\n        displayError(QObject::tr(\"Failed to register AppImage in system via libappimage\"));\n        return false;\n    }\n\n    const auto* desktopFilePath = appimage_registered_desktop_file_path(pathToAppImage.toStdString().c_str(), nullptr, false);\n\n    // sanity check -- if the file doesn't exist, the function returns NULL\n    if (desktopFilePath == nullptr) {\n        displayError(QObject::tr(\"Failed to find integrated desktop file\"));\n        return false;\n    }\n\n    // check that file exists\n    if (!QFile(desktopFilePath).exists()) {\n        displayError(QObject::tr(\"Couldn't find integrated AppImage's desktop file\"));\n        return false;\n    }\n\n    /* write AppImageLauncher specific entries to desktop file\n     *\n     * unfortunately, QSettings doesn't work as a desktop file reader/writer, and libqtxdg isn't really meant to be\n     * used by projects via add_subdirectory/ExternalProject\n     * a system dependency is not an option for this project, and we link to glib already anyway, so let's just use\n     * glib, which is known to work\n     */\n\n    std::shared_ptr<GKeyFile> desktopFile(g_key_file_new(), gKeyFileDeleter);\n\n    std::shared_ptr<GError*> error(nullptr, gErrorDeleter);\n\n    const auto flags = GKeyFileFlags(G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS);\n\n    auto handleError = [error, desktopFile]() {\n        std::ostringstream ss;\n        ss << QObject::tr(\"Failed to load desktop file:\").toStdString() << std::endl << (*error)->message;\n        displayError(QString::fromStdString(ss.str()));\n    };\n\n    if (!g_key_file_load_from_file(desktopFile.get(), desktopFilePath, flags, error.get())) {\n        handleError();\n        return false;\n    }\n\n    const auto* nameEntry = g_key_file_get_string(desktopFile.get(), G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, error.get());\n\n    if (nameEntry == nullptr) {\n        displayWarning(QObject::tr(\"AppImage has invalid desktop file\"));\n    }\n\n    if (resolveCollisions) {\n        // TODO: support multilingual collisions\n        auto collisions = findCollisions(nameEntry);\n\n        // make sure to remove own entry\n        collisions.erase(collisions.find(desktopFilePath));\n\n        if (!collisions.empty()) {\n            // collisions are resolved like in the filesystem: a monotonically increasing number in brackets is\n            // appended to the Name in order to keep the number monotonically increasing, we look for the highest\n            // number in brackets in the existing entries, add 1 to it, and append it in brackets to the current\n            // desktop file's Name entry\n\n            unsigned int currentNumber = 1;\n\n            QRegularExpression regex(R\"(^.*\\(([0-9]+)\\)$)\");\n\n            for (const auto& collision : collisions) {\n                const auto& currentNameEntry = collision.second;\n\n                auto match = regex.match(QString::fromStdString(currentNameEntry));\n\n                if (match.hasMatch()) {\n                    // 0 = entire string\n                    // 1 = first group\n                    const QString numString = match.captured(1);\n                    const int num = numString.toInt();\n\n                    // monotonic counting, i.e., never try to \"be smart\" by e.g., filling in the gaps between\n                    // previous numbers\n                    if (num >= currentNumber) {\n                        currentNumber = num + 1;\n                    }\n                }\n            }\n\n            auto newName = QString(nameEntry) + \" (\" + QString::number(currentNumber) + \")\";\n            g_key_file_set_string(desktopFile.get(), G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, newName.toStdString().c_str());\n        }\n    }\n\n    auto convertToCharPointerList = [](const std::vector<std::string>& stringList) {\n        std::vector<const char*> pointerList;\n\n        // reserve space to increase efficiency\n        pointerList.reserve(stringList.size());\n\n        // convert string list to list of const char pointers\n        for (const auto& action : stringList) {\n            pointerList.push_back(action.c_str());\n        }\n\n        return pointerList;\n    };\n\n    std::vector<std::string> desktopActions;\n\n    // we may not just overwrite the existing actions key, as then the actions cannot be used any more from the context menu\n    {\n        const auto* actionsEntry = g_key_file_get_string(desktopFile.get(), G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ACTIONS, error.get());\n        for (const QString& action : QString(actionsEntry).split(\";\")) {\n            if (action.isEmpty()) {\n                continue;\n            }\n\n            desktopActions.emplace_back(action.toStdString());\n        }\n    }\n\n    // use a \"vendor prefix\" to avoid collisions with existing actions, as \"Update\" and \"Remove\" are generic terms\n    static const std::string removeActionKey{\"AppImageLauncher-Remove-AppImage\"};\n    static const std::string updateActionKey{\"AppImageLauncher-Update-AppImage\"};\n\n    desktopActions.emplace_back(removeActionKey);\n\n    // load translations from JSON file(s)\n    QMap<QString, QString> removeActionNameTranslations;\n\n#ifdef ENABLE_UPDATE_HELPER\n    QMap<QString, QString> updateActionNameTranslations;\n\n    {\n        QDirIterator i18nDirIterator(TranslationManager::getTranslationDir());\n\n        while(i18nDirIterator.hasNext()) {\n            const auto& filePath = i18nDirIterator.next();\n            const auto& fileName = QFileInfo(filePath).fileName();\n\n            if (!QFileInfo(filePath).isFile() || !(fileName.startsWith(\"desktopfiles.\") && fileName.endsWith(\".json\")))\n                continue;\n\n            // check whether filename's format is alright, otherwise parsing the locale might try to access a\n            // non-existing (or the wrong) member\n            auto splitFilename = fileName.split(\".\");\n\n            if (splitFilename.size() != 3)\n                continue;\n\n            // parse locale from filename\n            auto locale = splitFilename[1];\n\n            QFile jsonFile(filePath);\n\n            if (!jsonFile.open(QIODevice::ReadOnly)) {\n                displayWarning(QMessageBox::tr(\"Could not parse desktop file translations:\\nCould not open file for reading:\\n\\n%1\").arg(fileName));\n            }\n\n            // TODO: need to make sure that this doesn't try to read huge files at once\n            auto data = jsonFile.readAll();\n\n            QJsonParseError parseError{};\n            auto jsonDoc = QJsonDocument::fromJson(data, &parseError);\n\n            // show warning on syntax errors and continue\n            if (parseError.error != QJsonParseError::NoError || jsonDoc.isNull() || !jsonDoc.isObject()) {\n                displayWarning(QMessageBox::tr(\"Could not parse desktop file translations:\\nInvalid syntax:\\n\\n%1\").arg(parseError.errorString()));\n            }\n\n            auto jsonObj = jsonDoc.object();\n\n            for (const auto& key : jsonObj.keys()) {\n                auto value = jsonObj[key].toString();\n                auto splitKey = key.split(\"/\");\n\n                if (key.startsWith(\"Desktop Action update\")) {\n                    qDebug() << \"update: adding\" << value << \"for locale\" << locale;\n                    updateActionNameTranslations[locale] = value;\n                } else if (key.startsWith(\"Desktop Action remove\")) {\n                    qDebug() << \"remove: adding\" << value << \"for locale\" << locale;\n                    removeActionNameTranslations[locale] = value;\n                }\n            }\n        }\n    }\n#endif\n\n#ifndef BUILD_LITE\n    auto privateLibDir = privateLibDirPath(\"ui\");\n\n    const char helperIconName[] = \"AppImageLauncher\";\n#else\n    const char helperIconName[] = \"AppImageLauncher-Lite\";\n#endif\n\n    // add Remove action\n    {\n        const auto removeSectionName = \"Desktop Action \" + removeActionKey;\n\n        g_key_file_set_string(desktopFile.get(), removeSectionName.c_str(), \"Name\", \"Delete this AppImage\");\n        g_key_file_set_string(desktopFile.get(), removeSectionName.c_str(), \"Icon\", helperIconName);\n\n        std::ostringstream removeExecPath;\n\n#ifndef BUILD_LITE\n        removeExecPath << privateLibDir.toStdString() << \"/remove\";\n#else\n        removeExecPath << getenv(\"HOME\") << \"/.local/lib/appimagelauncher-lite/appimagelauncher-lite.AppImage remove\";\n#endif\n\n        removeExecPath << \" \\\"\" << pathToAppImage.toStdString() << \"\\\"\";\n\n        g_key_file_set_string(desktopFile.get(), removeSectionName.c_str(), \"Exec\", removeExecPath.str().c_str());\n\n        // install translations\n        auto it = QMapIterator<QString, QString>(removeActionNameTranslations);\n        while (it.hasNext()) {\n            auto entry = it.next();\n            g_key_file_set_locale_string(desktopFile.get(), removeSectionName.c_str(), \"Name\", entry.key().toStdString().c_str(), entry.value().toStdString().c_str());\n        }\n    }\n\n#ifdef ENABLE_UPDATE_HELPER\n    // add Update action\n    {\n        appimage::update::Updater updater(pathToAppImage.toStdString());\n\n        // but only if there's update information\n        if (!updater.updateInformation().empty()) {\n            // section needs to be announced in desktop actions list\n            desktopActions.emplace_back(updateActionKey);\n\n            const auto updateSectionName = \"Desktop Action \" + updateActionKey;\n\n            g_key_file_set_string(desktopFile.get(), updateSectionName.c_str(), \"Name\", \"Update this AppImage\");\n            g_key_file_set_string(desktopFile.get(), updateSectionName.c_str(), \"Icon\", helperIconName);\n\n            std::ostringstream updateExecPath;\n\n#ifndef BUILD_LITE\n            updateExecPath << privateLibDir.toStdString() << \"/update\";\n#else\n            updateExecPath << getenv(\"HOME\") << \"/.local/lib/appimagelauncher-lite/appimagelauncher-lite.AppImage update\";\n#endif\n            updateExecPath << \" \\\"\" << pathToAppImage.toStdString() << \"\\\"\";\n\n            g_key_file_set_string(desktopFile.get(), updateSectionName.c_str(), \"Exec\", updateExecPath.str().c_str());\n\n            // install translations\n            auto it = QMapIterator<QString, QString>(updateActionNameTranslations);\n            while (it.hasNext()) {\n                auto entry = it.next();\n                g_key_file_set_locale_string(desktopFile.get(), updateSectionName.c_str(), \"Name\", entry.key().toStdString().c_str(), entry.value().toStdString().c_str());\n            }\n        }\n    }\n#endif\n\n    // add desktop actions key\n    g_key_file_set_string_list(\n            desktopFile.get(),\n            G_KEY_FILE_DESKTOP_GROUP,\n            G_KEY_FILE_DESKTOP_KEY_ACTIONS,\n            convertToCharPointerList(desktopActions).data(),\n            desktopActions.size()\n    );\n\n    // add version key\n    const auto version = QApplication::applicationVersion().replace(\"version \", \"\").toStdString();\n    g_key_file_set_string(desktopFile.get(), G_KEY_FILE_DESKTOP_GROUP, \"X-AppImageLauncher-Version\", version.c_str());\n\n    // save desktop file to disk\n    if (!g_key_file_save_to_file(desktopFile.get(), desktopFilePath, error.get())) {\n        handleError();\n        return false;\n    }\n\n    // make desktop file executable (\"trustworthy\" to some DEs)\n    // TODO: handle this in libappimage\n    makeExecutable(desktopFilePath);\n\n    // notify KDE/Plasma about icon change\n    {\n        auto message = QDBusMessage::createSignal(QStringLiteral(\"/KIconLoader\"), QStringLiteral(\"org.kde.KIconLoader\"), QStringLiteral(\"iconChanged\"));\n        message.setArguments({0});\n        QDBusConnection::sessionBus().send(message);\n    }\n\n    return true;\n}\n\nbool updateDesktopFileAndIcons(const QString& pathToAppImage) {\n    return installDesktopFileAndIcons(pathToAppImage, true);\n}\n\nIntegrationState integrateAppImage(const QString& pathToAppImage, const QString& pathToIntegratedAppImage) {\n    // need std::strings to get working pointers with .c_str()\n    const auto oldPath = pathToAppImage.toStdString();\n    const auto newPath = pathToIntegratedAppImage.toStdString();\n\n    // create target directory\n    QDir().mkdir(QFileInfo(QFile(pathToIntegratedAppImage)).dir().absolutePath());\n\n    // check whether AppImage is in integration directory already\n    if (QFileInfo(pathToAppImage).absoluteFilePath() != QFileInfo(pathToIntegratedAppImage).absoluteFilePath()) {\n        // need to check whether file exists\n        // if it does, the existing AppImage needs to be removed before rename can be called\n        if (QFile(pathToIntegratedAppImage).exists()) {\n            std::ostringstream message;\n            message << QObject::tr(\"AppImage with same filename has already been integrated.\").toStdString() << std::endl\n                    << std::endl\n                    << QObject::tr(\"Do you wish to overwrite the existing AppImage?\").toStdString() << std::endl\n                    << QObject::tr(\"Choosing No will run the AppImage once, and leave the system in its current state.\").toStdString();\n\n            auto* messageBox = new QMessageBox(\n                QMessageBox::Warning,\n                QObject::tr(\"Warning\"),\n                QString::fromStdString(message.str()),\n                QMessageBox::Yes | QMessageBox::No\n            );\n\n            messageBox->setDefaultButton(QMessageBox::No);\n            messageBox->show();\n\n            QApplication::exec();\n\n            if (messageBox->clickedButton() == messageBox->button(QMessageBox::No)) {\n                return INTEGRATION_ABORTED;\n            }\n\n            QFile(pathToIntegratedAppImage).remove();\n        }\n\n        if (!QFile(pathToAppImage).rename(pathToIntegratedAppImage)) {\n            auto* messageBox = new QMessageBox(\n                QMessageBox::Critical,\n                QObject::tr(\"Error\"),\n                QObject::tr(\"Failed to move AppImage to target location.\\n\"\n                            \"Try to copy AppImage instead?\"),\n                QMessageBox::Ok | QMessageBox::Cancel\n            );\n\n            messageBox->setDefaultButton(QMessageBox::Ok);\n            messageBox->show();\n\n            QApplication::exec();\n\n            if (messageBox->clickedButton() == messageBox->button(QMessageBox::Cancel))\n                return INTEGRATION_FAILED;\n\n            if (!QFile(pathToAppImage).copy(pathToIntegratedAppImage)) {\n                displayError(\"Failed to copy AppImage to target location\");\n                return INTEGRATION_FAILED;\n            }\n        }\n    }\n\n    if (!installDesktopFileAndIcons(pathToIntegratedAppImage))\n        return INTEGRATION_FAILED;\n\n    return INTEGRATION_SUCCESSFUL;\n}\n\nQString getAppImageDigestMd5(const QString& path) {\n    // try to read embedded MD5 digest\n    unsigned long offset = 0, length = 0;\n\n    // first of all, digest calculation is supported only for type 2\n    if (appimage_get_type(path.toStdString().c_str(), false) != 2)\n        return \"\";\n\n    auto rv = appimage_get_elf_section_offset_and_length(path.toStdString().c_str(), \".digest_md5\", &offset, &length);\n\n    QByteArray buffer(16, '\\0');\n\n    if (rv && offset != 0 && length != 0) {\n        // open file and read digest from ELF header section\n        QFile file(path);\n\n        if (!file.open(QFile::ReadOnly))\n            return \"\";\n\n        if (!file.seek(static_cast<qint64>(offset)))\n            return \"\";\n\n        if (!file.read(buffer.data(), buffer.size()))\n            return \"\";\n\n        file.close();\n    }\n\n    bool needToCalculateDigest;\n\n    // there seem to be some AppImages out there who actually have the required section embedded, but it's empty\n    // therefore we make the assumption that a hash value of zeroes is probably incorrect and recalculate\n    // in the extremely rare case in which the AppImage's digest would *really* be that value, we'd waste a bit of\n    // computation time, but the chances are so low... who cares, right?\n    {\n        auto nonZeroCharacterFound = false;\n\n        for (const char i : buffer) {\n            if (i != '\\0') {\n                nonZeroCharacterFound = true;\n                break;\n            }\n        }\n\n        needToCalculateDigest = !nonZeroCharacterFound;\n    }\n\n    if (needToCalculateDigest) {\n        // calculate digest\n        if (!appimage_type2_digest_md5(path.toStdString().c_str(), buffer.data()))\n            return \"\";\n    }\n\n    // create hexadecimal representation\n    auto hexDigest = appimage_hexlify(buffer, static_cast<size_t>(buffer.size()));\n\n    QString hexDigestStr(hexDigest);\n\n    free(hexDigest);\n\n    return hexDigestStr;\n}\n\nbool hasAlreadyBeenIntegrated(const QString& pathToAppImage) {\n    return appimage_is_registered_in_system(pathToAppImage.toStdString().c_str());\n}\n\nbool isInDirectory(const QString& pathToAppImage, const QDir& directory) {\n    return directory == QFileInfo(pathToAppImage).absoluteDir();\n}\n\nbool cleanUpOldDesktopIntegrationResources(bool verbose) {\n    auto dirPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + \"/applications\";\n\n    auto directory = QDir(dirPath);\n\n    QStringList filters;\n    filters << \"appimagekit_*.desktop\";\n\n    directory.setNameFilters(filters);\n\n    for (auto desktopFilePath : directory.entryList()) {\n        desktopFilePath = dirPath + \"/\" + desktopFilePath;\n\n        std::shared_ptr<GKeyFile> desktopFile(g_key_file_new(), [](GKeyFile* p) {\n            g_key_file_free(p);\n        });\n\n        if (!g_key_file_load_from_file(desktopFile.get(), desktopFilePath.toStdString().c_str(), G_KEY_FILE_NONE, nullptr)) {\n            continue;\n        }\n\n        std::shared_ptr<char> execValue(g_key_file_get_string(desktopFile.get(), G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, nullptr), [](char* p) {\n            free(p);\n        });\n\n        // if there is no Exec value in the file, the desktop file is apparently broken, therefore we skip the file\n        if (execValue == nullptr) {\n            continue;\n        }\n\n        std::shared_ptr<char> tryExecValue(g_key_file_get_string(desktopFile.get(), G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, nullptr), [](char* p) {\n            free(p);\n        });\n\n        // TryExec is optional, although recently the desktop integration functions started to force add such keys\n        // with a path to the desktop file\n        // (before, if it existed, the key was replaced with the AppImage's path)\n        // If it exists, we assume its value is the full path to the AppImage, which can be used to check the existence\n        // of the AppImage\n        QString appImagePath;\n\n        if (tryExecValue != nullptr) {\n            appImagePath = QString(tryExecValue.get());\n        } else {\n            appImagePath = QString(execValue.get()).split(\" \").first();\n        }\n\n        // now, check whether AppImage exists\n        // FIXME: the split command for the Exec value might not work if there's a space in the filename\n        // we really need a parser that understands the desktop file escaping\n        if (!QFile(appImagePath).exists()) {\n            if (verbose)\n                std::cout << \"AppImage no longer exists, cleaning up resources: \" << appImagePath.toStdString() << std::endl;\n\n            if (verbose)\n                std::cout << \"Removing desktop file: \" << desktopFilePath.toStdString() << std::endl;\n\n            QFile(desktopFilePath).remove();\n\n            // TODO: clean up related resources such as icons or MIME definitions\n\n            auto* iconValue = g_key_file_get_string(desktopFile.get(), G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, nullptr);\n\n            if (iconValue != nullptr) {\n                const auto dataLocation = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);\n                const auto iconsPath = QString::fromStdString(dataLocation.toStdString() + \"/share/icons/\");\n\n                for (QDirIterator it(iconsPath, QDirIterator::Subdirectories); it.hasNext();) {\n                    auto path = it.next();\n\n                    if (QFileInfo(path).completeBaseName().startsWith(iconValue)) {\n                        QFile::remove(path);\n                    }\n                }\n            }\n        }\n    }\n\n    return true;\n}\n\ntime_t getMTime(const QString& path) {\n    struct stat st{};\n    if (stat(path.toStdString().c_str(), &st) != 0) {\n        displayError(QObject::tr(\"Failed to call stat() on path:\\n\\n%1\").arg(path));\n        return -1;\n    }\n\n    return st.st_mtim.tv_sec;\n}\n\nbool desktopFileHasBeenUpdatedSinceLastUpdate(const QString& pathToAppImage) {\n    const auto ownBinaryPath = getOwnBinaryPath();\n\n    const auto desktopFilePath = appimage_registered_desktop_file_path(pathToAppImage.toStdString().c_str(), nullptr, false);\n    \n    auto ownBinaryMTime = getMTime(ownBinaryPath.get());\n    auto desktopFileMTime = getMTime(desktopFilePath);\n\n    // check if something has failed horribly\n    if (desktopFileMTime < 0 || ownBinaryMTime < 0)\n        return false;\n\n    return desktopFileMTime > ownBinaryMTime;\n}\n\nbool isAppImage(const QString& path) {\n    const auto type = appimage_get_type(path.toUtf8(), false);\n    return type > 0 && type <= 2;\n}\n\nQString which(const std::string& name) {\n    std::vector<char> command(4096);\n    snprintf(command.data(), command.size()-1, \"which %s\", name.c_str());\n\n    auto* proc = popen(command.data(), \"r\");\n\n    if (proc == nullptr)\n        throw std::runtime_error(\"Failed to start process for which\");\n\n    std::vector<char> outBuf(4096);\n\n    fread(outBuf.data(), sizeof(char), outBuf.size()-1, proc);\n\n    pclose(proc);\n\n    QString rv(outBuf.data());\n\n    rv.replace(\"\\n\", \"\");\n\n    return rv;\n}\n\nvoid checkAuthorizationAndShowDialogIfNecessary(const QString& path, const QString& question) {\n    const uint32_t ownUid = getuid();\n    const uint32_t fileOwnerUid = QFileInfo(path).ownerId();\n    const auto fileOwnerUsername = QFileInfo(path).owner();\n\n    if (ownUid != fileOwnerUid) {\n        qDebug() << \"attempting relaunch with root helper\";\n\n        QString messageBoxText = QMessageBox::tr(\"File %1 is owned by another user: %2\").arg(path).arg(fileOwnerUsername);\n        messageBoxText += \"\\n\\n\";\n        messageBoxText += question;\n\n        auto* messageBox = new QMessageBox(\n            QMessageBox::Warning,\n            QMessageBox::tr(\"Permissions problem\"),\n            messageBoxText,\n            QMessageBox::Ok | QMessageBox::Abort,\n            nullptr\n        );\n\n        messageBox->setDefaultButton(QMessageBox::Ok);\n        messageBox->show();\n\n        QApplication::exec();\n\n        const auto relaunch = messageBox->clickedButton() == messageBox->button(QMessageBox::Ok);\n\n        if (!relaunch) {\n            qDebug() << \"Dialog aborted\";\n            exit(1);\n        }\n\n        qDebug() << \"ok, attempting relaunch with root helper\";\n\n        // pkexec doesn't retain $DISPLAY etc., as per the man page, so we can't run UI programs with it\n        for (const auto& rootHelperFilename : {/*\"pkexec\",*/ \"gksudo\", \"gksu\"}) {\n            const auto rootHelperPath = which(rootHelperFilename);\n            qDebug() << \"trying root helper \" << rootHelperFilename << rootHelperPath;\n\n            if (rootHelperPath.isEmpty())\n                continue;\n\n            qDebug() << rootHelperFilename << rootHelperPath;\n\n            std::vector<char*> argv = {\n                strdup(rootHelperPath.toStdString().c_str()),\n            };\n\n            if (fileOwnerUid != 0) {\n                argv.emplace_back(strdup(\"--user\"));\n                argv.emplace_back(strdup(std::to_string(fileOwnerUid).c_str()));\n            }\n\n            for (const auto& arg : QCoreApplication::arguments()) {\n                argv.emplace_back(strdup(arg.toStdString().c_str()));\n            }\n\n            argv.emplace_back(nullptr);\n\n            const auto rv = execv(strdup(rootHelperPath.toStdString().c_str()), argv.data());\n\n            // if the execution fails, we should signalize this to the user instead of silently failing over to the\n            // next tool\n            QMessageBox::critical(\n                    nullptr,\n                    QMessageBox::tr(\"Error\"),\n                    QMessageBox::tr(\"Failed to run permissions helper, exited with return code %1\").arg(rv)\n            );\n            exit(1);\n        }\n\n        QMessageBox::critical(\n            nullptr,\n            QMessageBox::tr(\"Error\"),\n            QMessageBox::tr(\"Could not find suitable permissions helper, aborting\")\n        );\n        exit(1);\n    }\n}\n\nQString pathToPrivateDataDirectory() {\n    // first we need to find the translation directory\n    // if this is run from the build tree, we try a path that can only work within the build directory\n    // then, we try the expected install location relative to the main binary\n    const auto binaryDirPath = QApplication::applicationDirPath();\n\n    // our helper tools are not shipped in usr/bin but usr/lib/<arch>-linux-gnu/appimagelauncher\n    // therefore we need to check for the translations directory relative to this directory as well\n    // as <arch-linux-gnu> may not be used in the path, we also check for its parent directory\n    QString dataDir = binaryDirPath + \"/../../share/appimagelauncher/\";\n\n    if (!QDir(dataDir).exists()) {\n        dataDir = binaryDirPath + \"/../../../share/appimagelauncher/\";\n    }\n\n    // this directory should work for the main application in usr/bin\n    if (!QDir(dataDir).exists()) {\n        dataDir = binaryDirPath + \"/../share/appimagelauncher/\";\n    }\n\n    if (!QDir(dataDir).exists()) {\n        std::cerr << \"[AppImageLauncher] Warning: \"\n                  << \"Path to private data directory could not be found\" << std::endl;\n        return \"\";\n    }\n\n    return dataDir;\n}\n\nbool unregisterAppImage(const QString& pathToAppImage) {\n    auto rv = appimage_unregister_in_system(pathToAppImage.toStdString().c_str(), false);\n\n    if (rv != 0)\n        return false;\n\n    return true;\n}\n\nQIcon loadIconWithFallback(const QString& iconName) {\n    const QString subdirName(\"fallback-icons\");\n    const auto binaryDir = QApplication::applicationDirPath();\n\n    // first we check the directory that would be expected with in the build environment\n    QDir fallbackIconDirectory = QDir(binaryDir + \"/../../resources/\" + subdirName);\n\n    // if that doesn't work, we check the private data directory, which should work when AppImageLauncher is installed\n    // through the packages or in Lite's AppImage\n    if (!fallbackIconDirectory.exists()) {\n        auto privateDataDir = pathToPrivateDataDirectory();\n\n        if (privateDataDir.length() > 0 && QDir(privateDataDir).exists()) {\n            fallbackIconDirectory = QDir(pathToPrivateDataDirectory() + \"/\" + subdirName);\n        }\n    }\n\n    // fallback icons aren't critical enough to exit the application if they can't be found\n    // after all, the theme icons may work just as well\n    if (!fallbackIconDirectory.exists()) {\n        std::cerr << \"[AppImageLauncher] Warning:\"\n                  << \"fallback icons could not be loaded: directory could not be found\" << std::endl;\n        return QIcon{};\n    }\n\n    qDebug() << \"Loading fallback for icon\" << iconName;\n\n    const auto iconFilename = iconName + \".svg\";\n    const auto iconPath = fallbackIconDirectory.filePath(iconFilename);\n\n    if (!QFileInfo(iconPath).isFile()) {\n        std::cerr << \"[AppImageLauncher] Warning: can't find fallback icon for name\"\n                  << iconName.toStdString() << std::endl;\n        return QIcon{};\n    }\n\n    const auto fallbackIcon = QIcon(iconPath);\n    qDebug() << fallbackIcon;\n\n    return fallbackIcon;\n}\n\nvoid setUpFallbackIconPaths(QWidget* parent) {\n    /**\n     * Qt 5.12 adds a feature to add fallback paths for icons. This is a very simple way to automatically load custom\n     * icons when the icon theme doesn't provide a suitable alternative.\n     * However, we need to support a much older Qt version. Therefore we cannot use this very very handy feature.\n     * We basically iterate over all buttons which carry an icon and (re)load it, but this time provide a fallback\n     * loaded from our private data directory.\n     */\n\n    // for now we only support buttons\n    // we could always add more widgets which provide an icon property\n    const auto buttons = parent->findChildren<QAbstractButton*>();\n\n    for (const auto& button : buttons) {\n        const auto iconName = button->icon().name();\n\n        // sort out buttons without an icon\n        if (iconName.length() <= 0)\n            continue;\n\n        // load icon from theme, providing the bundled icon as a fallback\n        // loading an \"empty\" (i.e., isNull() returns true) icon as fallback, as returned by loadIconWithFallback(...),\n        // works just fine\n        auto fallbackIcon = loadIconWithFallback(iconName);\n        auto newIcon = QIcon::fromTheme(iconName, fallbackIcon);\n\n        if (newIcon.isNull() || newIcon.pixmap(16, 16).isNull())\n            newIcon = fallbackIcon;\n\n        // now replace the button's actual icon with the fallback-enabled one\n        button->setIcon(newIcon);\n    }\n}\n"
  },
  {
    "path": "src/shared/shared.h",
    "content": "/* central file for utility functions */\n\n#pragma once\n\n// system headers\n#include <string>\n#include <memory>\n\n// library headers\n#include <QDir>\n#include <QString>\n#include <QSettings>\n\n// local headers\n#include \"types.h\"\n\nenum IntegrationState {\n    INTEGRATION_FAILED = 0,\n    INTEGRATION_SUCCESSFUL,\n    INTEGRATION_ABORTED\n};\n\n// standard location for integrated AppImages\n// currently hardcoded, can not be changed by users\nstatic const auto DEFAULT_INTEGRATION_DESTINATION = QString(getenv(\"HOME\")) + \"/Applications/\";\n\n// little convenience method to display warnings\nvoid displayWarning(const QString& message);\n\n// little convenience method to display errors\nvoid displayError(const QString& message);\n\n// reliable way to check if the current session is graphical or not\nbool isHeadless();\n\n// makes an existing file executable\nbool makeExecutable(const QString& path);\n\n// removes executable bits from file's permissions\nbool makeNonExecutable(const QString& path);\n\n#ifndef BUILD_LITE\n// calculate path to private libdir, containing tools and libraries specific to and used by AppImageLauncher\nQString privateLibDirPath(const QString& srcSubdirName);\n#endif\n\n// installs desktop file for given AppImage, including AppImageLauncher specific modifications\n// set resolveCollisions to false in order to leave the Name entries as-is\nbool installDesktopFileAndIcons(const QString& pathToAppImage, bool resolveCollisions = true);\n\n// update AppImage's existing desktop file with AppImageLauncher specific entries\n// this alias for installDesktopFileAndIcons does not perform any collision detection and resolving\nbool updateDesktopFileAndIcons(const QString& pathToAppImage);\n\n// update desktop database and icon caches of desktop environments\n// this makes sure that:\n//   - outdated entries are removed from the launcher\n//   - icons of freshly integrated AppImages are displayed in the launcher\nbool updateDesktopDatabaseAndIconCaches();\n\n// integrates an AppImage using a standard workflow used across all AppImageLauncher applications\nIntegrationState integrateAppImage(const QString& pathToAppImage, const QString& pathToIntegratedAppImage);\n\n// write config file to standard location with given configuration values\n// askToMove and enableDaemon both are bools but represented as int to add some sort of \"unset\" state\n// < 0: unset; 0 = false; > 0 = true\n// destination is a string that, when empty, will be interpreted as \"use default\"\nvoid createConfigFile(int askToMove, const QString& destination, int enableDaemon,\n                      const QStringList& additionalDirsToWatch = {}, int monitorMountedFilesystems = -1);\n\n// replaces ~ character in paths with real home directory, if necessary and possible\nQString expandTilde(QString path);\n\n// load config file and return it\nQSettings* getConfig(QObject* parent = nullptr);\n\n// return directory into which the integrated AppImages will be moved\nQDir integratedAppImagesDestination();\n\n// additional directories to monitor for AppImages, and to permit AppImages to be within (i.e., shall not ask whether\n// to move to the main location, if they're in one of these, it's all good)\nQSet<QString> additionalAppImagesLocations(bool includeValidMountPoints = false);\n\n// calculate list of directories the daemon has to watch\n// AppImages inside there should furthermore not be moved out of there and into the main integration directory\nQDirSet daemonDirectoriesToWatch(const QSettings* config);\n\n// build path to standard location for integrated AppImages\nQString buildPathToIntegratedAppImage(const QString& pathToAppImage);\n\n// get AppImage MD5 digest\n// extracts the digest embedded in the file\n// if no such digest has been embedded, it calculates it using libappimage\nQString getAppImageDigestMd5(const QString& path);\n\n// checks whether AppImage has been integrated already\nbool hasAlreadyBeenIntegrated(const QString& pathToAppImage);\n\n// checks whether file is in a given directory\nbool isInDirectory(const QString& pathToAppImage, const QDir& directory);\n\n// clean up old desktop files (and related resources, such as icons)\nbool cleanUpOldDesktopIntegrationResources(bool verbose = false);\n\n// returns absolute path to currently running binary\nstd::shared_ptr<char> getOwnBinaryPath();\n\n// returns true if AppImageLauncher was updated since the desktop file for a given AppImage has been updated last\nbool desktopFileHasBeenUpdatedSinceLastUpdate(const QString& pathToAppImage);\n\n// checks whether a file is an AppImage\nbool isAppImage(const QString& path);\n\n// when a file doesn't belong to the current user, this method shows a dialog asking whether to relaunch as that user\n// this can be used when e.g., updating AppImages owned by root or other users\n// uses pkexec, gksudo, gksu etc., whatever is available\n// the second argument is the question that will be asked in the dialog displayed in case a relaunch is necessary\nvoid checkAuthorizationAndShowDialogIfNecessary(const QString& path, const QString& question);\n\n// searchs for path to private data directory relative to the current binary's location\n// returns empty string if the path cannot be found\nQString pathToPrivateDataDirectory();\n\n// clean up desktop integration files installed while originally integrating the AppImage\nbool unregisterAppImage(const QString& pathToAppImage);\n\n// try to load icon with provided name from AppImageLauncher's fallback icons directory\n// returns empty QIcon if such an icon cannot be found\n// you can check for errors by calling QIcon::isNull()\nQIcon loadIconWithFallback(const QString& iconName);\n\n// sets up paths to fallback icons bundled with AppImageLauncher\nvoid setUpFallbackIconPaths(QWidget*);\n"
  },
  {
    "path": "src/shared/types.cpp",
    "content": "#include \"types.h\"\n\nQDebug operator<<(QDebug debug, const QDirSet& set) {\n    QDebugStateSaver saver(debug);\n    for (const auto& item : set) {\n        debug << item;\n    }\n    return debug;\n}\n"
  },
  {
    "path": "src/shared/types.h",
    "content": "#pragma once\n\n// system headers\n#include <set>\n\n// library headers\n#include <QDebug>\n#include <QDir>\n\nstruct QDirComparator {\npublic:\n    size_t operator()(const QDir& a, const QDir& b) const {\n        return a.absolutePath() < b.absolutePath();\n    }\n};\n\ntypedef std::set<QDir, QDirComparator> QDirSet;\n\n\nQDebug operator<<(QDebug debug, const QDirSet &set);\n"
  },
  {
    "path": "src/trashbin/CMakeLists.txt",
    "content": "add_library(trashbin STATIC trashbin.cpp trashbin.h)\ntarget_link_libraries(trashbin PUBLIC Qt5::Core libappimage shared)\ntarget_include_directories(translationmanager PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})\n"
  },
  {
    "path": "src/trashbin/trashbin.cpp",
    "content": "// system includes\n#include <iostream>\n#include <sys/stat.h>\n\n// library includes\n#include <QDateTime>\n#include <QDir>\n#include <QDirIterator>\n#include <appimage/appimage.h>\n\n// local includes\n#include \"trashbin.h\"\n#include \"shared.h\"\n\nclass TrashBin::PrivateData {\n    public:\n        const QDir dir;\n\n    public:\n        PrivateData() : dir(integratedAppImagesDestination().path() + \"/.trash\") {\n            // make sure trash directory exists\n            QDir(integratedAppImagesDestination().path()).mkdir(\".trash\");\n        }\n\n        bool canBeCleanedUp(const QString& path) {\n            return true;\n        }\n};\n\nTrashBin::TrashBin() {\n    d = new PrivateData();\n}\n\nQString TrashBin::path() {\n    return d->dir.path();\n}\n\nbool TrashBin::disposeAppImage(const QString& pathToAppImage) {\n    if (!QFile(pathToAppImage).exists()) {\n        std::cerr << \"No such file or directory: \" << pathToAppImage.toStdString() << std::endl;\n        return false;\n    }\n\n    // moving AppImages into the trash bin might fail if there's a file with the same filename\n    // removing multiple files with the same filenames is a valid use case, though\n    // therefore, a timestamp shall be prepended to the filename\n    // it is very unlike that some user will remove more than a AppImage per second, but if that should be the case,\n    // we could eventually increase the precision of the timestamp\n    // for now, this is not necessary\n    auto timestamp = QDateTime::currentDateTime().toString(Qt::ISODate);\n    auto newPath = d->dir.path() + QString(\"/\") + timestamp + \"_\" + QFileInfo(pathToAppImage).fileName();\n\n    if (!QFile(pathToAppImage).rename(newPath))\n        return false;\n\n    if (!makeNonExecutable(newPath))\n        return false;\n\n    return true;\n}\n\nbool TrashBin::cleanUp() {\n    for (QDirIterator iterator(d->dir, QDirIterator::FollowSymlinks); iterator.hasNext();) {\n        auto currentPath = iterator.next();\n\n        if (!QFileInfo(currentPath).isFile())\n            continue;\n\n        if (appimage_get_type(currentPath.toStdString().c_str(), false) <= 0)\n            continue;\n\n        if (!d->canBeCleanedUp(currentPath)) {\n            std::cerr << \"Cannot clean up AppImage yet: \" << currentPath.toStdString() << std::endl;\n            continue;\n        }\n\n        std::cerr << \"Removing AppImage: \" << currentPath.toStdString() << std::endl;\n\n        // silently ignore if files can not be removed\n        // they shall be removed on subsequent runs\n        // if this won't happen and the trash directory will only get bigger at some point, we might need to\n        // reconsider this decision\n        if (!QFile(currentPath).remove())\n            continue;\n    }\n\n    return true;\n}\n"
  },
  {
    "path": "src/trashbin/trashbin.h",
    "content": "// system includes\n#include <QString>\n\n#pragma once\n\nclass TrashBin {\n    private:\n        class PrivateData;\n        PrivateData* d;\n\n    public:\n        TrashBin();\n\n    public:\n        QString path();\n\n    public:\n        // move AppImage into trash bin directory\n        bool disposeAppImage(const QString& pathToAppImage);\n\n        // check all AppImages in trash bin whether they can be removed\n        // this function should be called regularly to make sure the files in the trash bin are cleaned up as soon\n        // as possible\n        bool cleanUp();\n};\n"
  },
  {
    "path": "src/ui/CMakeLists.txt",
    "content": "if(NOT BUILD_LITE)\n    # main AppImageLauncher application\n    add_executable(AppImageLauncher main.cpp resources.qrc first-run.cpp first-run.h first-run.ui integration_dialog.cpp integration_dialog.h integration_dialog.ui)\n    target_link_libraries(AppImageLauncher shared PkgConfig::glib libappimage shared)\n\n    # set binary runtime rpath to make sure the libappimage.so built and installed by this project is going to be used\n    # by the installed binaries (be it the .deb, the AppImage, or whatever)\n    # in order to make the whole install tree relocatable, a relative path is used\n    set_target_properties(AppImageLauncher PROPERTIES INSTALL_RPATH ${_rpath})\n\n    install(\n        TARGETS\n        AppImageLauncher\n        RUNTIME DESTINATION ${_bindir} COMPONENT APPIMAGELAUNCHER\n        LIBRARY DESTINATION ${_libdir} COMPONENT APPIMAGELAUNCHER\n    )\nendif()\n\n# AppImageLauncherSettings application\nadd_executable(AppImageLauncherSettings settings_main.cpp resources.qrc settings_dialog.ui settings_dialog.cpp)\ntarget_link_libraries(AppImageLauncherSettings shared)\n\n# set binary runtime rpath to make sure the libappimage.so built and installed by this project is going to be used\n# by the installed binaries (be it the .deb, the AppImage, or whatever)\n# in order to make the whole install tree relocatable, a relative path is used\nset_target_properties(AppImageLauncherSettings PROPERTIES INSTALL_RPATH ${_rpath})\n\ninstall(\n    TARGETS\n    AppImageLauncherSettings\n    RUNTIME DESTINATION ${_bindir} COMPONENT APPIMAGELAUNCHER\n    LIBRARY DESTINATION ${_libdir} COMPONENT APPIMAGELAUNCHER\n)\n\n# AppImage removal helper\nadd_executable(remove remove_main.cpp remove.ui resources.qrc)\ntarget_link_libraries(remove shared translationmanager libappimage)\n# see AppImageLauncher for a description\nset_target_properties(remove PROPERTIES INSTALL_RPATH \"\\$ORIGIN\")\n\ninstall(\n    TARGETS\n    remove\n    RUNTIME DESTINATION ${_private_libdir} COMPONENT APPIMAGELAUNCHER\n)\n\n\n# AppImage update helper\nif(ENABLE_UPDATE_HELPER)\n    add_executable(update update.ui update_main.cpp resources.qrc)\n    target_link_libraries(update shared translationmanager libappimage libappimageupdate-qt Qt5::Quick Qt5::QuickWidgets Qt5::Qml)\n    # see AppImageLauncher for a description\n    set_target_properties(update PROPERTIES INSTALL_RPATH \"\\$ORIGIN\")\n\n    install(\n        TARGETS\n        update\n        RUNTIME DESTINATION ${_private_libdir} COMPONENT APPIMAGELAUNCHER\n    )\nendif()\n"
  },
  {
    "path": "src/ui/first-run.cpp",
    "content": "// system includes\n#include <stdexcept>\n\n// library includes\n#include <QDesktopServices>\n#include <QDialog>\n#include <QDialogButtonBox>\n#include <QLabel>\n#include <QDebug>\n#include <QFileDialog>\n#include <QGraphicsScene>\n#include <QGraphicsView>\n#include <QGraphicsPixmapItem>\n#include <QImage>\n#include <QLayout>\n#include <QStyle>\n#include <QUrl>\n\n// local includes\n#include \"ui_first-run.h\"\n#include \"shared.h\"\n\n\nclass FirstRunDialog : public QDialog {\nprivate:\n    Ui::FirstRunDialog* firstRunDialog{};\n\n    // stores custom destination dir for AppImages\n    // if this is empty, the default value (defined in-code, might change over time) will be chosen\n    // the default will not be written to the config file, hence we need a way to detect that state, and it's assumed\n    // that when this string is empty, that's the case\n    // we could also just compare this directory with the default value just before saving, but IMO it's more obvious\n    // to the user that the \"default\" state is lost after having saved something with the \"choose\" button in a file\n    // dialog\n    QString destinationDir;\n\nprivate Q_SLOTS:\n    void resetDefaults() {\n        firstRunDialog->askMoveCheckBox->setChecked(true);\n\n        destinationDir = \"\";\n        updateDestinationDirLabel();\n    }\n\n    void handleButtonClicked(QAbstractButton* button) {\n        if (button == firstRunDialog->buttonBox->button(QDialogButtonBox::RestoreDefaults)) {\n            qDebug() << \"restore defaults\";\n            resetDefaults();\n        } else if (button == firstRunDialog->buttonBox->button(QDialogButtonBox::Help)) {\n            qDebug() << \"help\";\n            QDesktopServices::openUrl(QUrl(\"https://github.com/TheAssassin/AppImageLauncher/wiki/First-run\"));\n\n        } else {\n            qDebug() << \"unknown button clicked\" << button;\n        }\n    }\n\n    void handleAskMoveCheckBoxStateChange(int state) {\n        qDebug() << \"new ask move check box state\" << state;\n\n        // this alone unfortunately doesn't do the trick...\n        for (auto* layout : {\n            static_cast<QLayout*>(firstRunDialog->destDirVertLayout),\n            static_cast<QLayout*>(firstRunDialog->destDirHorLayout),\n        }) {\n            layout->setEnabled(state > 0);\n        }\n\n        // have to also manually enable/disable all the\n        for (auto* label : {\n            static_cast<QWidget*>(firstRunDialog->destinationDirDescLabel),\n            static_cast<QWidget*>(firstRunDialog->destinationDirLabel),\n            static_cast<QWidget*>(firstRunDialog->customizeIntegrationDirButton),\n        }) {\n            label->setEnabled(state > 0);\n        }\n    }\n\n    void handleCustomizeIntegrationDirButtonClicked(bool checked = false) {\n        (void) checked;\n\n        auto oldDir = destinationDir;\n        if (oldDir.isEmpty())\n            oldDir = integratedAppImagesDestination().absolutePath();\n\n        auto newDir = QFileDialog::getExistingDirectory(this, tr(\"Choose integration destination dir\"), oldDir);\n\n        // the call above returns an empty string if the user aborts the dialog\n        if (!newDir.isEmpty()) {\n            destinationDir = newDir;\n        }\n\n        // updating never is a bad idea\n        updateDestinationDirLabel();\n    }\n\nprivate:\n    void updateDestinationDirLabel() {\n        QString text = destinationDir;\n\n        // fallback to default\n        if (text.isEmpty())\n            text = integratedAppImagesDestination().absolutePath() + \" \" + tr(\"(default)\");\n\n        firstRunDialog->destinationDirLabel->setText(text);\n    }\n\n    void initUi() {\n        firstRunDialog = new Ui::FirstRunDialog;\n        // setupUi will modify this dialog so that it looks just like what we designed in Qt Designer\n        firstRunDialog->setupUi(this);\n\n        // set up logo in a QLabel\n        firstRunDialog->logoLabel->setText(\"\");\n        auto pixmap = QPixmap::fromImage(QImage(\":/AppImageLauncher.svg\")).scaled(QSize(128,128),\n                Qt::KeepAspectRatio, Qt::SmoothTransformation\n        );\n        firstRunDialog->logoLabel->setPixmap(pixmap);\n\n        // setting icon in Qt Designer doesn't seem to work\n        firstRunDialog->customizeIntegrationDirButton->setIcon(this->style()->standardIcon(QStyle::SP_DirIcon));\n\n        // reset defaults\n        resetDefaults();\n\n        // set up all connections\n        connect(firstRunDialog->buttonBox, &QDialogButtonBox::clicked, this, &FirstRunDialog::handleButtonClicked);\n        connect(firstRunDialog->askMoveCheckBox, &QCheckBox::stateChanged, this, &FirstRunDialog::handleAskMoveCheckBoxStateChange);\n\n        connect(firstRunDialog->customizeIntegrationDirButton, &QPushButton::clicked, this, &FirstRunDialog::handleCustomizeIntegrationDirButtonClicked);\n    }\n\npublic:\n    FirstRunDialog() {\n        initUi();\n    }\n\n    void writeConfigFile() {\n        bool askToMove = firstRunDialog->askMoveCheckBox->checkState() == Qt::Checked;\n        createConfigFile(askToMove ? 1 : 0, destinationDir, -1);\n    }\n};\n\n\nvoid showFirstRunDialog() {\n    auto dialog = new FirstRunDialog;\n\n    setUpFallbackIconPaths(dialog);\n\n    auto rv = dialog->exec();\n\n    if (rv <= 0) {\n        QApplication::exit(3);\n        exit(3);\n    }\n\n    dialog->writeConfigFile();\n}\n"
  },
  {
    "path": "src/ui/first-run.h",
    "content": "void showFirstRunDialog();\n"
  },
  {
    "path": "src/ui/first-run.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>FirstRunDialog</class>\n <widget class=\"QDialog\" name=\"FirstRunDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>532</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Expanding\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"windowTitle\">\n   <string>First run</string>\n  </property>\n  <property name=\"sizeGripEnabled\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QGridLayout\" name=\"gridLayout\">\n   <property name=\"sizeConstraint\">\n    <enum>QLayout::SetDefaultConstraint</enum>\n   </property>\n   <item row=\"0\" column=\"0\">\n    <widget class=\"QLabel\" name=\"logoLabel\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"minimumSize\">\n      <size>\n       <width>130</width>\n       <height>130</height>\n      </size>\n     </property>\n     <property name=\"text\">\n      <string notr=\"true\"/>\n     </property>\n     <property name=\"pixmap\">\n      <pixmap>:/AppImageLauncher.svg</pixmap>\n     </property>\n     <property name=\"scaledContents\">\n      <bool>false</bool>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignHCenter|Qt::AlignTop</set>\n     </property>\n     <property name=\"margin\">\n      <number>8</number>\n     </property>\n    </widget>\n   </item>\n   <item row=\"0\" column=\"1\">\n    <widget class=\"QLabel\" name=\"welcomeTextLabel\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"MinimumExpanding\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"minimumSize\">\n      <size>\n       <width>0</width>\n       <height>0</height>\n      </size>\n     </property>\n     <property name=\"text\">\n      <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:11pt; font-weight:600;&quot;&gt;Welcome to AppImageLauncher!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This little helper is designed to improve your AppImage experience on your computer.&lt;/p&gt;&lt;p&gt;It appears you have never run AppImageLauncher before. Please take a minute and configure your preferences. You can always change these later on, using the control panel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n     <property name=\"margin\">\n      <number>2</number>\n     </property>\n    </widget>\n   </item>\n   <item row=\"1\" column=\"0\" colspan=\"2\">\n    <widget class=\"QCheckBox\" name=\"askMoveCheckBox\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"text\">\n      <string>Ask me whether to move new AppImages into a central location</string>\n     </property>\n     <property name=\"checked\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item row=\"2\" column=\"0\" colspan=\"2\">\n    <layout class=\"QVBoxLayout\" name=\"destDirVertLayout\">\n     <property name=\"spacing\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"destinationDirDescLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Integration target destination directory:</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"destDirHorLayout\">\n       <property name=\"sizeConstraint\">\n        <enum>QLayout::SetDefaultConstraint</enum>\n       </property>\n       <item>\n        <widget class=\"QLabel\" name=\"destinationDirLabel\">\n         <property name=\"font\">\n          <font>\n           <family>DejaVu Sans Mono</family>\n          </font>\n         </property>\n         <property name=\"text\">\n          <string notr=\"true\">path placeholder</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"customizeIntegrationDirButton\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n           <horstretch>15</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"minimumSize\">\n          <size>\n           <width>100</width>\n           <height>0</height>\n          </size>\n         </property>\n         <property name=\"text\">\n          <string>Customize</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item row=\"3\" column=\"0\" colspan=\"2\">\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults</set>\n     </property>\n     <property name=\"centerButtons\">\n      <bool>false</bool>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>FirstRunDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>FirstRunDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "src/ui/integration_dialog.cpp",
    "content": "// system includes\n#include <sstream>\n#include <utility>\n\n// library includes\n#include <QStyle>\n\n// local headers\n#include \"integration_dialog.h\"\n#include \"ui_integration_dialog.h\"\n\nIntegrationDialog::IntegrationDialog(QString pathToAppImage, QString integratedAppImagesDestinationPath,\n                                     QWidget* parent) :\n    QDialog(parent), ui(new Ui::IntegrationDialog),\n    pathToAppImage(std::move(pathToAppImage)),\n    integratedAppImagesDestinationPath(std::move(integratedAppImagesDestinationPath)) {\n    ui->setupUi(this);\n\n    setIcon();\n    setMessage();\n\n    QObject::connect(ui->pushButtonIntegrateAndRun, &QPushButton::released, this,\n                     &IntegrationDialog::onPushButtonIntegrateAndRunReleased);\n    QObject::connect(ui->pushButtonRunOnce, &QPushButton::released, this,\n                     &IntegrationDialog::onPushButtonRunOnceReleased);\n\n    // make translation fit by adjusting the minimum size of the message label to the size calculated by Qt\n    ui->message->setMinimumSize(ui->message->sizeHint());\n}\n\nvoid IntegrationDialog::setMessage() {\n    QString message = ui->message->text();\n    message = message.arg(pathToAppImage, integratedAppImagesDestinationPath);\n    ui->message->setText(message);\n}\n\nvoid IntegrationDialog::setIcon() {\n    QIcon icon = QIcon(\":/AppImageLauncher.svg\");\n    QPixmap pixmap = icon.pixmap(QSize(64, 64));\n    ui->icon->setPixmap(pixmap);\n}\n\nIntegrationDialog::~IntegrationDialog() {\n    delete ui;\n}\n\nvoid IntegrationDialog::onPushButtonIntegrateAndRunReleased() {\n    this->resultAction = ResultingAction::IntegrateAndRun;\n    this->accept();\n}\n\nvoid IntegrationDialog::onPushButtonRunOnceReleased() {\n    this->resultAction = ResultingAction::RunOnce;\n    this->accept();\n}\n\nIntegrationDialog::ResultingAction IntegrationDialog::getResultAction() const {\n    return resultAction;\n}\n"
  },
  {
    "path": "src/ui/integration_dialog.h",
    "content": "#ifndef APPIMAGELAUNCHER_INTEGRATION_DIALOG_H\n#define APPIMAGELAUNCHER_INTEGRATION_DIALOG_H\n\n// library includes\n#include <QDialog>\n\nQT_BEGIN_NAMESPACE\nnamespace Ui { class IntegrationDialog; }\nQT_END_NAMESPACE\n\nclass IntegrationDialog : public QDialog {\nQ_OBJECT\n\npublic:\n    enum ResultingAction {\n        IntegrateAndRun,\n        RunOnce\n    };\n\n    explicit IntegrationDialog(QString pathToAppImage, QString integratedAppImagesDestinationPath,\n                               QWidget* parent = nullptr);\n\n    ~IntegrationDialog() override;\n\n    ResultingAction getResultAction() const;\n\nprotected:\n    Q_SLOT void onPushButtonIntegrateAndRunReleased();\n\n    Q_SLOT void onPushButtonRunOnceReleased();\n\n    ResultingAction resultAction;\n\nprivate:\n    Ui::IntegrationDialog* ui;\n    QString pathToAppImage;\n    QString integratedAppImagesDestinationPath;\n\n    void setIcon();\n\n    void setMessage();\n};\n\n#endif //APPIMAGELAUNCHER_INTEGRATION_DIALOG_H\n"
  },
  {
    "path": "src/ui/integration_dialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>IntegrationDialog</class>\n <widget class=\"QDialog\" name=\"IntegrationDialog\">\n  <property name=\"windowModality\">\n   <enum>Qt::WindowModal</enum>\n  </property>\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>460</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Expanding\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Desktop Integration</string>\n  </property>\n  <property name=\"sizeGripEnabled\">\n   <bool>false</bool>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"icon\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Icon</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n       </property>\n       <property name=\"margin\">\n        <number>12</number>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <widget class=\"QLabel\" name=\"message\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"MinimumExpanding\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"text\">\n          <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%1 has not been integrated into your system.&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &lt;br /&gt;Integrating it will move the AppImage into a predefined location, and include it in your application launcher.&lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;To remove or update the AppImage, please use the context menu of the application icon in your task bar or launcher. &lt;/p&gt;\n&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The directory where the integrated AppImages are stored in is currently set to: %2&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n         </property>\n         <property name=\"alignment\">\n          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n         </property>\n         <property name=\"wordWrap\">\n          <bool>true</bool>\n         </property>\n         <property name=\"margin\">\n          <number>0</number>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"pushButtonIntegrateAndRun\">\n       <property name=\"text\">\n        <string>Integrate and run</string>\n       </property>\n       <property name=\"default\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"pushButtonRunOnce\">\n       <property name=\"text\">\n        <string>Run once</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/main.cpp",
    "content": "// system includes\n#include <fstream>\n#include <iostream>\n#include <sstream>\n\nextern \"C\" {\n#include <sys/stat.h>\n#include <libgen.h>\n#include <unistd.h>\n#include <glib.h>\n}\n\n// library includes\n#include <QApplication>\n#include <QCommandLineParser>\n#include <QDebug>\n#include <QDir>\n#include <QFile>\n#include <QFileDialog>\n#include <QFileInfo>\n#include <QMessageBox>\n#include <QProcess>\n#include <QPushButton>\n#include <QRegularExpression>\n#include <QString>\n\nextern \"C\" {\n#include <appimage/appimage.h>\n}\n\n// local headers\n#include \"shared.h\"\n#include \"trashbin.h\"\n#include \"translationmanager.h\"\n#include \"first-run.h\"\n#include \"integration_dialog.h\"\n\n// Runs an AppImage. Returns suitable exit code for main application.\nint runAppImage(const QString& pathToAppImage, unsigned long argc, char** argv) {\n    // needs to be converted to std::string to be able to use c_str()\n    // when using QString and then .toStdString().c_str(), the std::string instance will be an rvalue, and the\n    // pointer returned by c_str() will be invalid\n    auto fullPathToAppImage = QFileInfo(pathToAppImage).absoluteFilePath();\n\n    auto type = appimage_get_type(fullPathToAppImage.toStdString().c_str(), false);\n    if (type < 1 || type > 3) {\n        displayError(QObject::tr(\"AppImageLauncher does not support type %1 AppImages at the moment.\").arg(type));\n        return 1;\n    }\n\n    // first of all, chmod +x the AppImage registerFile\n    // be happy the registerFile is executable already\n    if (!makeExecutable(fullPathToAppImage)) {\n        displayError(QObject::tr(\"Could not make AppImage executable: %1\").arg(fullPathToAppImage));\n        return 1;\n    }\n\n    // suppress desktop integration script etc.\n    setenv(\"DESKTOPINTEGRATION\", \"AppImageLauncher\", true);\n\n    auto makeVectorBuffer = [](const std::string& str) {\n        std::vector<char> strBuffer(str.size() + 1, '\\0');\n        strncpy(strBuffer.data(), str.c_str(), str.size());\n        return strBuffer;\n    };\n\n    // calculate buffer to bypass binary\n    std::string pathToBinfmtBypassLauncher = privateLibDirPath(\"binfmt-bypass\").toStdString() + \"/binfmt-bypass\";\n\n    // create new args array for exec()d process\n    std::vector<char*> args;\n\n    // first argument is the path to our launcher\n    auto pathToBinfmtBypassLauncherBuffer = makeVectorBuffer(pathToBinfmtBypassLauncher);\n    args.push_back(pathToBinfmtBypassLauncherBuffer.data());\n\n    // first argument is consumed by the bypass launcher\n    // the reason we launch the bypass launcher as a new process to save RAM (we have to launch the actual AppImage\n    // as a subprocess, and the launcher executable has a much lower memory footprint)\n    auto pathToAppImageBuffer = makeVectorBuffer(pathToAppImage.toStdString());\n    args.push_back(pathToAppImageBuffer.data());\n\n    // copy arguments\n    for (unsigned long i = 1; i < argc; i++) {\n        args.push_back(argv[i]);\n    }\n\n    // args need to be null terminated\n    args.push_back(nullptr);\n\n    execv(pathToBinfmtBypassLauncher.c_str(), args.data());\n\n    const auto& error = errno;\n    std::cerr << QObject::tr(\"execv() failed: %1\").arg(strerror(error)).toStdString() << std::endl;\n    return 1;\n}\n\n// factory method to build and return a suitable Qt application instance\n// it remembers a previously created instance, and will return it if available\n// otherwise a new one is created and configure\n// caution: cannot use <widget>.exec() any more, instead call <widget>.show() and use QApplication::exec()\nQCoreApplication* getApp(char** argv) {\n    if (QCoreApplication::instance() != nullptr)\n        return QCoreApplication::instance();\n\n    // build application version string\n    std::string version;\n    {\n        std::ostringstream oss;\n        oss << \"version \" << APPIMAGELAUNCHER_VERSION << \" \"\n            << \"(git commit \" << APPIMAGELAUNCHER_GIT_COMMIT << \"), built on \"\n            << APPIMAGELAUNCHER_BUILD_DATE;\n        version = oss.str();\n    }\n\n    QCoreApplication* app;\n\n    // need to pass rvalue, hence defining a variable\n    int* fakeArgc = new int{1};\n\n    static char** fakeArgv = new char*{strdup(argv[0])};\n\n    if (isHeadless()) {\n        app = new QCoreApplication(*fakeArgc, fakeArgv);\n    } else {\n        auto uiApp = new QApplication(*fakeArgc, fakeArgv);\n        QApplication::setApplicationDisplayName(\"AppImageLauncher\");\n\n        // this doesn't seem to have any effect... but it doesn't hurt either\n        uiApp->setWindowIcon(QIcon(\":/AppImageLauncher.svg\"));\n\n        app = uiApp;\n    }\n\n    QCoreApplication::setApplicationName(\"AppImageLauncher\");\n    QCoreApplication::setApplicationVersion(QString::fromStdString(version));\n\n    return app;\n}\n\nint main(int argc, char** argv) {\n    // create a suitable application object (either graphical (QApplication) or headless (QCoreApplication))\n    // Use a fake argc value to avoid QApplication from modifying the arguments\n    QCoreApplication* app = getApp(argv);\n\n    // install translations\n    TranslationManager translationManager(*app);\n\n    // clean up old desktop files\n    if (!cleanUpOldDesktopIntegrationResources()) {\n        displayError(QObject::tr(\"Failed to clean up old desktop files\"));\n        return 1;\n    }\n\n    // clean up trash directory\n    {\n        TrashBin bin;\n        if (!bin.cleanUp()) {\n            displayError(QObject::tr(\"Failed to clean up AppImage trash bin: %1\").arg(bin.path()));\n        }\n    }\n\n    std::ostringstream usage;\n    usage << QObject::tr(\"Usage: %1 [options] <path>\").arg(argv[0]).toStdString() << std::endl\n          << QObject::tr(\"Desktop integration helper for AppImages, for use by Linux distributions.\").toStdString()\n          << std::endl\n          << std::endl\n          << QObject::tr(\"Options:\").toStdString() << std::endl\n          << \"  --appimagelauncher-help     \" << QObject::tr(\"Display this help and exit\").toStdString() << std::endl\n          << \"  --appimagelauncher-version  \" << QObject::tr(\"Display version and exit\").toStdString() << std::endl\n          << std::endl\n          << QObject::tr(\"Arguments:\").toStdString() << std::endl\n          << \"  path                        \" << QObject::tr(\"Path to AppImage (mandatory)\").toStdString() << std::endl;\n\n    auto displayVersion = [&app]() {\n        std::cerr << \"AppImageLauncher \" << app->applicationVersion().toStdString() << std::endl;\n    };\n\n    // display usage and exit if path to AppImage is missing\n    if (argc <= 1) {\n        displayVersion();\n        std::cerr << std::endl;\n        std::cerr << usage.str();\n        return 1;\n    }\n\n    std::vector<char*> appImageArgv;\n    // search for --appimagelauncher-* arguments in args list\n    for (int i = 1; i < argc; i++) {\n        QString arg = argv[i];\n\n        // reserved argument space\n        const QString prefix = \"--appimagelauncher-\";\n\n        if (arg.startsWith(prefix)) {\n            if (arg == prefix + \"help\") {\n                displayVersion();\n                std::cerr << std::endl;\n                std::cerr << usage.str();\n                return 0;\n            } else if (arg == prefix + \"version\") {\n                displayVersion();\n                return 0;\n            } else if (arg == prefix + \"cleanup\") {\n                // exit immediately after cleanup\n                return 0;\n            } else {\n                std::cerr << QObject::tr(\"Unknown AppImageLauncher option: %1\").arg(arg).toStdString() << std::endl;\n                return 1;\n            }\n        } else {\n            appImageArgv.emplace_back(argv[i]);\n        }\n    }\n\n    // sanitize path\n    auto pathToAppImage = QDir(QString(argv[1])).absolutePath();\n\n    if (!QFile(pathToAppImage).exists()) {\n        displayError(QObject::tr(\"Error: no such file or directory: %1\").arg(pathToAppImage));\n        return 1;\n    }\n\n    // if the users wishes to disable AppImageLauncher, we just run the AppImage as-ish\n    // also we don't ever want to integrate symlinks (see #290 for more information)\n    if (getenv(\"APPIMAGELAUNCHER_DISABLE\") != nullptr || QFileInfo(pathToAppImage).isSymLink()) {\n        return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n    }\n\n    const auto type = appimage_get_type(pathToAppImage.toStdString().c_str(), false);\n\n    if (type <= 0 || type > 2) {\n        displayError(QObject::tr(\"Not an AppImage: %1\").arg(pathToAppImage));\n        return 1;\n    }\n\n    // type 2 specific checks\n    if (type == 2) {\n        // check parameters\n        {\n            for (int i = 0; i < argc; i++) {\n                QString arg = argv[i];\n\n                // reserved argument space\n                const QString prefix = \"--appimage-\";\n\n                if (arg.startsWith(prefix)) {\n                    // don't annoy users who try to mount or extract AppImages\n                    if (arg == prefix + \"mount\" || arg == prefix + \"extract\" || arg == prefix + \"updateinformation\") {\n                        return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n                    }\n                }\n            }\n        }\n    }\n\n    // enable and start/disable and stop appimagelauncherd service\n    auto config = getConfig();\n\n    // assumes defaults if config doesn't exist or lacks the related key(s)\n    if (config == nullptr || !config->contains(\"AppImageLauncher/enable_daemon\") ||\n        config->value(\"AppImageLauncher/enable_daemon\").toBool()) {\n        system(\"systemctl --user enable appimagelauncherd.service\");\n        system(\"systemctl --user start  appimagelauncherd.service\");\n    } else {\n        system(\"systemctl --user disable appimagelauncherd.service\");\n        system(\"systemctl --user stop    appimagelauncherd.service\");\n    }\n\n    // beyond the next block, the code requires a UI\n    // as we don't want to offer integration over a headless connection, we just run the AppImage\n    if (isHeadless()) {\n        return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n    }\n\n    // if config doesn't exist, create a default one\n    if (config == nullptr) {\n        showFirstRunDialog();\n        config = getConfig();\n    }\n\n    if (config == nullptr) {\n        displayError(\"Could not read config file\");\n    }\n\n    // if the user opted out of the \"ask move\" thing, we can just run the AppImage\n    if (config->contains(\"AppImageLauncher/ask_to_move\") && !config->value(\"AppImageLauncher/ask_to_move\").toBool()) {\n        return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n    }\n\n    // check for X-AppImage-Integrate=false\n    auto shallNotBeIntegrated = appimage_shall_not_be_integrated(pathToAppImage.toStdString().c_str());\n    if (shallNotBeIntegrated < 0)\n        std::cerr << \"AppImageLauncher error: appimage_shall_not_be_integrated() failed (returned \"\n                  << shallNotBeIntegrated << \")\" << std::endl;\n    else if (shallNotBeIntegrated > 0)\n        return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n\n    // AppImages in AppImages are not supposed to be integrated\n    if (pathToAppImage.startsWith(\"/tmp/.mount_\"))\n        return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n\n    // ignore terminal apps (fixes #2)\n    auto isTerminalApp = appimage_is_terminal_app(pathToAppImage.toStdString().c_str());\n    if (isTerminalApp < 0)\n        std::cerr << \"AppImageLauncher error: appimage_is_terminal_app() failed (returned \" << isTerminalApp << \")\"\n                  << std::endl;\n    else if (isTerminalApp > 0)\n        return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n\n    // AppImages in AppImages are not supposed to be integrated\n    if (pathToAppImage.startsWith(\"/tmp/.mount_\"))\n        return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n\n    const auto pathToIntegratedAppImage = buildPathToIntegratedAppImage(pathToAppImage);\n\n    auto integrateAndRunAppImage = [&pathToAppImage, &pathToIntegratedAppImage, &appImageArgv]() {\n        // check whether integration was successful\n        auto rv = integrateAppImage(pathToAppImage, pathToIntegratedAppImage);\n\n        // make sure the icons in the launcher are refreshed\n        if (!updateDesktopDatabaseAndIconCaches())\n            return 1;\n\n        if (rv == INTEGRATION_FAILED) {\n            return 1;\n        } else if (rv == INTEGRATION_ABORTED) {\n            return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n        } else {\n            return runAppImage(pathToIntegratedAppImage, appImageArgv.size(), appImageArgv.data());\n        }\n    };\n\n    // after checking whether the AppImage can/must be run without integrating it, we now check whether it actually\n    // has been integrated already\n    if (hasAlreadyBeenIntegrated(pathToAppImage)) {\n        auto updateAndRunAppImage = [&pathToAppImage, &appImageArgv]() {\n            // in case there was an update of AppImageLauncher, we should should also update the desktop database\n            // and icon caches\n            if (!desktopFileHasBeenUpdatedSinceLastUpdate(pathToAppImage)) {\n                if (!updateDesktopFileAndIcons(pathToAppImage))\n                    return 1;\n\n                // make sure the icons in the launcher are refreshed after updating the desktop file\n                if (!updateDesktopDatabaseAndIconCaches())\n                    return 1;\n            }\n            return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n        };\n\n        // assume we have to ask\n        // prove me wrong!\n        bool needToAskAboutMoving = true;\n\n        // okay, I'll try to prove you wrong\n        {\n            auto directoriesNotToAskAboutMovingFor = daemonDirectoriesToWatch(config);\n\n            // normally the main integration destination should be contained\n            // but bugs happen, and we want to be sure not to create a weird situation where you'd be asked about\n            // moving files into yet the directory you want to move them into\n            directoriesNotToAskAboutMovingFor.insert(integratedAppImagesDestination());\n\n            for (const auto& dir : directoriesNotToAskAboutMovingFor) {\n                if (isInDirectory(pathToAppImage, dir)) {\n                    needToAskAboutMoving = false;\n                    break;\n                }\n            }\n        }\n\n        // not so fast: even if it's not in the main integration directory, there's more viable locations where\n        // AppImages may reside just fine\n        if (needToAskAboutMoving) {\n            for (const auto& additionalLocation : additionalAppImagesLocations()) {\n                if (isInDirectory(pathToAppImage, additionalLocation)) {\n                    needToAskAboutMoving = false;\n                }\n            }\n        }\n\n        if (needToAskAboutMoving) {\n            auto* messageBox = new QMessageBox(\n                QMessageBox::Warning,\n                QMessageBox::tr(\"Warning\"),\n                QMessageBox::tr(\"AppImage %1 has already been integrated, but it is not in the current integration \"\n                                \"destination directory.\"\n                                \"\\n\\n\"\n                                \"Do you want to move it into the new destination?\"\n                                \"\\n\\n\"\n                                \"Choosing No will run the AppImage once, and leave the AppImage in its current \"\n                                \"directory.\"\n                                \"\\n\\n\").arg(pathToAppImage) +\n                // translate separately to share string with the other dialog\n                QObject::tr(\"The directory the integrated AppImages are stored in is currently set to:\\n\"\n                            \"%1\").arg(integratedAppImagesDestination().path()) + \"\\n\",\n                QMessageBox::Yes | QMessageBox::No\n            );\n\n            messageBox->setDefaultButton(QMessageBox::Yes);\n            messageBox->show();\n\n            QApplication::exec();\n\n            // if the user selects No, then continue as if the AppImage would not be in this directory\n            if (messageBox->clickedButton() == messageBox->button(QMessageBox::Yes)) {\n                // unregister AppImage, move, and re-integrate\n                if (appimage_unregister_in_system(pathToAppImage.toStdString().c_str(), false) != 0) {\n                    displayError(QMessageBox::tr(\"Failed to unregister AppImage before re-integrating it\"));\n                    return 1;\n                }\n\n                return integrateAndRunAppImage();\n            } else {\n                return updateAndRunAppImage();\n            }\n        } else {\n            return updateAndRunAppImage();\n        }\n    }\n\n    QString integratedAppImagesDestinationPath = integratedAppImagesDestination().path();\n    auto integrationDialog = new IntegrationDialog(pathToAppImage, integratedAppImagesDestinationPath);\n    integrationDialog->show();\n\n    // As the integration dialog is the only window in our application we can safely use its exec method\n    integrationDialog->exec();\n\n    if (integrationDialog->result() == QDialog::Rejected)\n        return 0;\n\n    switch (integrationDialog->getResultAction()) {\n        case IntegrationDialog::IntegrateAndRun:\n            return integrateAndRunAppImage();\n        case IntegrationDialog::RunOnce:\n            return runAppImage(pathToAppImage, appImageArgv.size(), appImageArgv.data());\n        default:\n            displayError(QObject::tr(\"Unexpected result from the integration dialog.\"));\n            return 1;\n    }\n}\n\n"
  },
  {
    "path": "src/ui/remove.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>RemoveDialog</class>\n <widget class=\"QDialog\" name=\"RemoveDialog\">\n  <property name=\"windowModality\">\n   <enum>Qt::WindowModal</enum>\n  </property>\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>415</width>\n    <height>96</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Delete AppImage</string>\n  </property>\n  <property name=\"locale\">\n   <locale language=\"English\" country=\"UnitedStates\"/>\n  </property>\n  <layout class=\"QGridLayout\" name=\"gridLayout\">\n   <item row=\"0\" column=\"0\">\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <property name=\"sizeConstraint\">\n      <enum>QLayout::SetMinimumSize</enum>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"messageLabel\">\n       <property name=\"text\">\n        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Are you sure you want to delete this AppImage?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"pathLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Minimum\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"minimumSize\">\n        <size>\n         <width>389</width>\n         <height>0</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string>%1</string>\n       </property>\n       <property name=\"wordWrap\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>RemoveDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>RemoveDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "src/ui/remove_main.cpp",
    "content": "// system includes\n#include <iostream>\n#include <sstream>\n\n// library includes\n#include <QApplication>\n#include <QCommandLineParser>\n#include <QDir>\n#include <QFile>\n#include <QFileDialog>\n#include <QFileInfo>\n#include <QLibraryInfo>\n#include <QMessageBox>\n#include <QObject>\n#include <QPushButton>\n#include <QTranslator>\nextern \"C\" {\n    #include <appimage/appimage.h>\n}\n\n// local includes\n#include \"shared.h\"\n#include \"translationmanager.h\"\n#include \"trashbin.h\"\n#include \"ui_remove.h\"\n\nint main(int argc, char** argv) {\n    QCommandLineParser parser;\n    parser.setApplicationDescription(QObject::tr(\"Helper to delete integrated AppImages easily, e.g., from the application launcher's context menu\"));\n    QApplication app(argc, argv);\n    QApplication::setApplicationDisplayName(\"AppImageLauncher\");\n    QApplication::setWindowIcon(QIcon(\":/AppImageLauncher.svg\"));\n\n    std::ostringstream version;\n    version << \"version \" << APPIMAGELAUNCHER_VERSION << \" \"\n            << \"(git commit \" << APPIMAGELAUNCHER_GIT_COMMIT << \"), built on \"\n            << APPIMAGELAUNCHER_BUILD_DATE;\n    QApplication::setApplicationVersion(QString::fromStdString(version.str()));\n\n    // install translations\n    TranslationManager translationManager(app);\n\n    parser.addHelpOption();\n    parser.addVersionOption();\n\n    parser.process(app);\n\n    parser.addPositionalArgument(\"path\", QObject::tr(\"Path to AppImage\"), QObject::tr(\"<path>\"));\n\n    if (parser.positionalArguments().empty()) {\n        parser.showHelp(1);\n    }\n\n    const auto pathToAppImage = parser.positionalArguments().first();\n\n    if (!QFile(pathToAppImage).exists()) {\n        QMessageBox::critical(nullptr, \"Error\", QObject::tr(\"Error: no such file or directory: %1\").arg(pathToAppImage));\n        return 1;\n    }\n\n    checkAuthorizationAndShowDialogIfNecessary(pathToAppImage, \"Delete anyway?\");\n\n    const auto type = appimage_get_type(pathToAppImage.toStdString().c_str(), false);\n\n    if (type <= 0 || type > 2) {\n        QMessageBox::critical(\n            nullptr,\n            QObject::tr(\"AppImage delete helper error\"),\n            QObject::tr(\"Not an AppImage:\\n\\n%1\").arg(pathToAppImage)\n        );\n        return 1;\n    }\n\n    // this tool should not do anything if the file isn't integrated\n    // the file is only supposed to work on integrated AppImages and _nothing else_\n//    if (!hasAlreadyBeenIntegrated(pathToAppImage)) {\n//        QMessageBox::critical(\n//                nullptr,\n//                QObject::tr(\"AppImage delete helper error\"),\n//                QObject::tr(\"Refusing to work on non-integrated AppImage:\\n\\n%1\").arg(pathToAppImage)\n//        );\n//        return 1;\n//    }\n\n    QDialog dialog;\n    Ui::RemoveDialog ui;\n\n    ui.setupUi(&dialog);\n    ui.pathLabel->setText(pathToAppImage);\n\n    // must be done *after* loading the UI into the dialog\n    setUpFallbackIconPaths(&dialog);\n\n    auto rv = dialog.exec();\n\n    // check if user has canceled the dialog\n    // a confirmation would result in an exit code of 1\n    if (rv != 1) {\n        return 0;\n    }\n\n    // first, unregister AppImage\n    if (!unregisterAppImage(pathToAppImage)) {\n        QMessageBox::critical(\n                nullptr,\n                QObject::tr(\"Error\"),\n                QObject::tr(\"Failed to unregister AppImage: %1\").arg(pathToAppImage)\n        );\n        return 1;\n    }\n\n    TrashBin bin;\n\n    // now, move AppImage into trash bin\n    if (!bin.disposeAppImage(pathToAppImage)) {\n        QMessageBox::critical(\n                nullptr,\n                QObject::tr(\"Error\"),\n                QObject::tr(\"Failed to move AppImage into trash bin directory\")\n        );\n        return 1;\n    }\n\n    // run clean up cycle for trash bin\n    // if the current AppImage is ready to be deleted, this call will immediately remove it from the system\n    // otherwise, it'll be cleaned up at some subsequent run of AppImageLauncher or the removal tool\n    if (!bin.cleanUp()) {\n        QMessageBox::critical(\n                nullptr,\n                QObject::tr(\"Error\"),\n                QObject::tr(\"Failed to clean up AppImage trash bin: %1\").arg(bin.path())\n        );\n        return 1;\n    }\n\n    // update desktop database and icon caches\n    if (!updateDesktopDatabaseAndIconCaches())\n        return 1;\n\n    return 0;\n}\n\n"
  },
  {
    "path": "src/ui/resources.qrc",
    "content": "<!DOCTYPE RCC>\n<RCC version=\"1.0\">\n    <qresource>\n        <file alias=\"AppImageLauncher.svg\">../../resources/icons/hicolor/scalable/apps/AppImageLauncher.svg</file>\n        <file alias=\"update_spinner.qml\">update_spinner.qml</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/ui/settings_dialog.cpp",
    "content": "// libraries\n#include <QDebug>\n#include <QFileDialog>\n#include <QFileIconProvider>\n#include <QStandardPaths>\n\n// local\n#include \"settings_dialog.h\"\n#include \"ui_settings_dialog.h\"\n#include \"shared.h\"\n\nSettingsDialog::SettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::SettingsDialog),\n                                                  settingsFile(getConfig(this)) {\n    ui->setupUi(this);\n\n    ui->applicationsDirLineEdit->setPlaceholderText(integratedAppImagesDestination().absolutePath());\n\n    loadSettings();\n\n// cosmetic changes in lite mode\n#ifdef BUILD_LITE\n    ui->daemonIsEnabledCheckBox->setChecked(true);\n    ui->daemonIsEnabledCheckBox->setEnabled(false);\n\n    ui->askMoveCheckBox->setChecked(false);\n    ui->askMoveCheckBox->setEnabled(false);\n#endif\n\n    connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &SettingsDialog::onDialogAccepted);\n    connect(ui->chooseAppsDirToolButton, &QToolButton::released, this, &SettingsDialog::onChooseAppsDirClicked);\n    connect(ui->additionalDirsAddButton, &QToolButton::released, this, &SettingsDialog::onAddDirectoryToWatchButtonClicked);\n    connect(ui->additionalDirsRemoveButton, &QToolButton::released, this, &SettingsDialog::onRemoveDirectoryToWatchButtonClicked);\n    connect(ui->additionalDirsListWidget, &QListWidget::itemActivated, this, &SettingsDialog::onDirectoryToWatchItemActivated);\n    connect(ui->additionalDirsListWidget, &QListWidget::itemClicked, this, &SettingsDialog::onDirectoryToWatchItemActivated);\n\n    QStringList availableFeatures;\n\n#ifdef ENABLE_UPDATE_HELPER\n    availableFeatures << \"<span style='color: green;'>✔</span> \" + tr(\"updater available for AppImages supporting AppImageUpdate\");\n#else\n    availableFeatures << \"<span style='color: red;'>🞬</span> \" + tr(\"updater unavailable\");\n#endif\n\n#ifdef BUILD_LITE\n    availableFeatures << \"<br /><br />\"\n                      << tr(\"<strong>Note: this is an AppImageLauncher Lite build, only supports a limited set of features</strong><br />\"\n                            \"Please install the full version via the provided native packages to enjoy the full AppImageLauncher experience\");\n#endif\n\n    ui->featuresLabel->setText(availableFeatures.join('\\n'));\n\n    // no matter what tab was selected when saving in Qt designer, we want to start up with the first tab\n    ui->tabWidget->setCurrentWidget(ui->launcherTab);\n}\n\nSettingsDialog::~SettingsDialog() {\n    delete ui;\n}\n\nvoid SettingsDialog::addDirectoryToWatchToListView(const QString& dirPath) {\n    // empty paths are not permitted\n    if (dirPath.isEmpty())\n        return;\n\n    const QDir dir(dirPath);\n\n    // we don't want to redundantly add the main integration directory\n    if (dir == integratedAppImagesDestination())\n        return;\n\n    QIcon icon;\n\n    auto findIcon = [](const std::initializer_list<QString>& names) {\n        for (const auto& i : names) {\n            auto icon = QIcon::fromTheme(i, loadIconWithFallback(i));\n\n            if (!icon.isNull())\n                return icon;\n        }\n\n        return QIcon{};\n    };\n\n    if (dir.exists()) {\n        icon = findIcon({\"folder\"});\n    } else {\n        // TODO: search for more meaningful icon, \"remove\" doesn't really show the directory is missing\n        icon = findIcon({\"remove\"});\n    }\n\n    if (icon.isNull()) {\n        qDebug() << \"item icon unavailable, using fallback\";\n    }\n\n    auto* item = new QListWidgetItem(icon, dirPath);\n    ui->additionalDirsListWidget->addItem(item);\n}\n\nvoid SettingsDialog::loadSettings() {\n    const auto daemonIsEnabled = settingsFile->value(\"AppImageLauncher/enable_daemon\", \"true\").toBool();\n    const auto askMoveChecked = settingsFile->value(\"AppImageLauncher/ask_to_move\", \"true\").toBool();\n\n    if (settingsFile) {\n        ui->daemonIsEnabledCheckBox->setChecked(daemonIsEnabled);\n        ui->askMoveCheckBox->setChecked(askMoveChecked);\n        ui->applicationsDirLineEdit->setText(settingsFile->value(\"AppImageLauncher/destination\").toString());\n\n        const auto additionalDirsPath = settingsFile->value(\"appimagelauncherd/additional_directories_to_watch\", \"\").toString();\n        for (const auto& dirPath : additionalDirsPath.split(\":\")) {\n            addDirectoryToWatchToListView(dirPath);\n        }\n    }\n}\n\nvoid SettingsDialog::onDialogAccepted() {\n    saveSettings();\n    toggleDaemon();\n}\n\nvoid SettingsDialog::saveSettings() {\n    QStringList additionalDirsToWatch;\n\n    {\n        QListWidgetItem* currentItem;\n\n        for (int i = 0; (currentItem = ui->additionalDirsListWidget->item(i)) != nullptr; ++i) {\n            additionalDirsToWatch << currentItem->text();\n        }\n    }\n\n    // temporary workaround to fill in the monitorMountedFilesystems with the same value it had in the old settings\n    // this is supposed to support the option while hiding it in the settings\n    int monitorMountedFilesystems = -1;\n    {\n        const auto oldSettings = getConfig();\n\n        static constexpr auto oldKey = \"appimagelauncherd/monitor_mounted_filesystems\";\n\n        // getConfig might return a null pointer if the config file doesn't exist\n        // we have to handle this, obviously\n        if (oldSettings != nullptr && oldSettings->contains(oldKey)) {\n            const auto oldValue = oldSettings->value(oldKey).toBool();\n            monitorMountedFilesystems = oldValue ? 1 : 0;\n        }\n    }\n\n    createConfigFile(ui->askMoveCheckBox->isChecked(),\n                     ui->applicationsDirLineEdit->text(),\n                     ui->daemonIsEnabledCheckBox->isChecked(),\n                     additionalDirsToWatch,\n                     monitorMountedFilesystems);\n\n    // reload settings\n    loadSettings();\n}\n\nvoid SettingsDialog::toggleDaemon() {\n    // assumes defaults if config doesn't exist or lacks the related key(s)\n    if (settingsFile) {\n        if (settingsFile->value(\"AppImageLauncher/enable_daemon\", \"true\").toBool()) {\n            system(\"systemctl --user enable  appimagelauncherd.service\");\n            // we want to actually restart the service to apply the new configuration\n            system(\"systemctl --user restart appimagelauncherd.service\");\n        } else {\n            system(\"systemctl --user disable appimagelauncherd.service\");\n            system(\"systemctl --user stop    appimagelauncherd.service\");\n        }\n    }\n}\n\nvoid SettingsDialog::onChooseAppsDirClicked() {\n    QFileDialog fileDialog(this);\n\n    fileDialog.setFileMode(QFileDialog::DirectoryOnly);\n    fileDialog.setWindowTitle(tr(\"Select Applications directory\"));\n    fileDialog.setDirectory(integratedAppImagesDestination().absolutePath());\n\n    // Gtk+ >= 3 segfaults when trying to use the native dialog, therefore we need to enforce the Qt one\n    // See #218 for more information\n    fileDialog.setOption(QFileDialog::DontUseNativeDialog, true);\n\n    if (fileDialog.exec()) {\n        QString dirPath = fileDialog.selectedFiles().first();\n        ui->applicationsDirLineEdit->setText(dirPath);\n    }\n}\n\nvoid SettingsDialog::onAddDirectoryToWatchButtonClicked() {\n    QFileDialog fileDialog(this);\n\n    fileDialog.setFileMode(QFileDialog::DirectoryOnly);\n    fileDialog.setWindowTitle(tr(\"Select additional directory to watch\"));\n    fileDialog.setDirectory(QStandardPaths::locate(QStandardPaths::HomeLocation, \".\", QStandardPaths::LocateDirectory));\n\n    // Gtk+ >= 3 segfaults when trying to use the native dialog, therefore we need to enforce the Qt one\n    // See #218 for more information\n    fileDialog.setOption(QFileDialog::DontUseNativeDialog, true);\n\n    if (fileDialog.exec()) {\n        QString dirPath = fileDialog.selectedFiles().first();\n        addDirectoryToWatchToListView(dirPath);\n    }\n}\n\nvoid SettingsDialog::onRemoveDirectoryToWatchButtonClicked() {\n    auto* widget = ui->additionalDirsListWidget;\n\n    auto* currentItem = widget->currentItem();\n\n    if (currentItem == nullptr)\n        return;\n\n    const auto index = widget->row(currentItem);\n\n    // after taking it, we have to delete it ourselves, Qt docs say\n    auto deletedItem = widget->takeItem(index);\n    delete deletedItem;\n\n    // we should deactivate the remove button once the last item is gone\n    if (widget->item(0) == nullptr) {\n        ui->additionalDirsRemoveButton->setEnabled(false);\n    }\n}\n\nvoid SettingsDialog::onDirectoryToWatchItemActivated(QListWidgetItem* item) {\n    // we activate the button based on whether there's an item selected\n    ui->additionalDirsRemoveButton->setEnabled(item != nullptr);\n}\n"
  },
  {
    "path": "src/ui/settings_dialog.h",
    "content": "#pragma once\n\n// system\n#include <memory>\n\n// libraries\n#include <QDialog>\n#include <QListWidgetItem>\n#include <QSettings>\n\n\nnamespace Ui {\n    class SettingsDialog;\n}\n\nclass SettingsDialog : public QDialog {\nQ_OBJECT\n\npublic:\n    explicit SettingsDialog(QWidget* parent = nullptr);\n\n    ~SettingsDialog() override;\n\nprotected slots:\n    void onChooseAppsDirClicked();\n    void onAddDirectoryToWatchButtonClicked();\n    void onRemoveDirectoryToWatchButtonClicked();\n    void onDirectoryToWatchItemActivated(QListWidgetItem* item);\n\n    void onDialogAccepted();\n\nprivate:\n    void loadSettings();\n\n    void saveSettings();\n\n    void toggleDaemon();\n\n    void addDirectoryToWatchToListView(const QString& dirPath);\n\n    Ui::SettingsDialog* ui;\n    QSettings* settingsFile;\n};\n"
  },
  {
    "path": "src/ui/settings_dialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>SettingsDialog</class>\n <widget class=\"QDialog\" name=\"SettingsDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>539</width>\n    <height>459</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>AppImageLauncher Settings</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"currentIndex\">\n      <number>1</number>\n     </property>\n     <widget class=\"QWidget\" name=\"launcherTab\">\n      <attribute name=\"title\">\n       <string notr=\"true\">AppImageLauncher</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"launcherGroupBox\">\n         <property name=\"title\">\n          <string>Launcher Dialog</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n          <item>\n           <widget class=\"QCheckBox\" name=\"askMoveCheckBox\">\n            <property name=\"text\">\n             <string>Ask whether to move AppImage files into the applications directory</string>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"integrationDirectoryGroupBox\">\n         <property name=\"title\">\n          <string>Location where to store your AppImage files to ease their management</string>\n         </property>\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n          <item>\n           <layout class=\"QHBoxLayout\" name=\"integrationGroupBoxLayout\">\n            <item>\n             <widget class=\"QLineEdit\" name=\"applicationsDirLineEdit\">\n              <property name=\"text\">\n               <string notr=\"true\"/>\n              </property>\n              <property name=\"placeholderText\">\n               <string>Applications directory path</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QToolButton\" name=\"chooseAppsDirToolButton\">\n              <property name=\"text\">\n               <string/>\n              </property>\n              <property name=\"icon\">\n               <iconset theme=\"folder\">\n                <normaloff>.</normaloff>.</iconset>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"availableFeaturesGroupBox\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"minimumSize\">\n          <size>\n           <width>0</width>\n           <height>80</height>\n          </size>\n         </property>\n         <property name=\"locale\">\n          <locale language=\"English\" country=\"UnitedStates\"/>\n         </property>\n         <property name=\"title\">\n          <string>Available Features</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n          <item>\n           <widget class=\"QLabel\" name=\"featuresLabel\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"minimumSize\">\n             <size>\n              <width>0</width>\n              <height>0</height>\n             </size>\n            </property>\n            <property name=\"layoutDirection\">\n             <enum>Qt::LeftToRight</enum>\n            </property>\n            <property name=\"text\">\n             <string notr=\"true\">TextLabel</string>\n            </property>\n            <property name=\"alignment\">\n             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n            </property>\n            <property name=\"wordWrap\">\n             <bool>true</bool>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"daemonTab\">\n      <attribute name=\"title\">\n       <string notr=\"true\">appimagelauncherd</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"daemonGeneralSettingsGroupBox\">\n         <property name=\"locale\">\n          <locale language=\"English\" country=\"UnitedStates\"/>\n         </property>\n         <property name=\"title\">\n          <string>General settings</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n          <item>\n           <widget class=\"QCheckBox\" name=\"daemonIsEnabledCheckBox\">\n            <property name=\"toolTip\">\n             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, AppImageLauncher automatically starts a daemon called appimagelauncherd.&lt;/p&gt;&lt;p&gt;This daemon automatically integrates AppImages you copy into the &amp;quot;Applications directory&amp;quot; and the additional directories you configured. When the files are deleted, the daemon will clean up the integration data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n            </property>\n            <property name=\"text\">\n             <string>Auto start auto-integration daemon</string>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"additionalDirsGroupBox\">\n         <property name=\"locale\">\n          <locale language=\"English\" country=\"UnitedStates\"/>\n         </property>\n         <property name=\"title\">\n          <string>Additional directories to watch</string>\n         </property>\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n          <item>\n           <widget class=\"QListWidget\" name=\"additionalDirsListWidget\"/>\n          </item>\n          <item>\n           <layout class=\"QVBoxLayout\" name=\"additionalDirsButtonsLayout\">\n            <item>\n             <widget class=\"QToolButton\" name=\"additionalDirsAddButton\">\n              <property name=\"toolTip\">\n               <string>Add new directory to list</string>\n              </property>\n              <property name=\"icon\">\n               <iconset theme=\"list-add\">\n                <normaloff>.</normaloff>.</iconset>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QToolButton\" name=\"additionalDirsRemoveButton\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"toolTip\">\n               <string>Remove selected directory from list</string>\n              </property>\n              <property name=\"icon\">\n               <iconset theme=\"list-remove\">\n                <normaloff>.</normaloff>.</iconset>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <spacer name=\"verticalSpacer_2\">\n              <property name=\"orientation\">\n               <enum>Qt::Vertical</enum>\n              </property>\n              <property name=\"sizeHint\" stdset=\"0\">\n               <size>\n                <width>20</width>\n                <height>40</height>\n               </size>\n              </property>\n             </spacer>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer_3\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeType\">\n      <enum>QSizePolicy::Minimum</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>10</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "src/ui/settings_main.cpp",
    "content": "// libraries\n#include <QApplication>\n\n// local\n#include <translationmanager.h>\n#include <shared.h>\n#include \"settings_dialog.h\"\n\nint main(int argc, char** argv) {\n    QApplication app(argc, argv);\n    QApplication::setApplicationDisplayName(\"AppImageLauncher Settings\");\n    QApplication::setWindowIcon(QIcon(\":/AppImageLauncher.svg\"));\n\n    TranslationManager mgr(app);\n//\n//    // we ship some very basic fallbacks for icons used in the settings dialog\n//    // this should fix missing icons on some distros\n\n    SettingsDialog dialog;\n\n    setUpFallbackIconPaths(&dialog);\n\n    dialog.show();\n\n    return app.exec();\n}\n"
  },
  {
    "path": "src/ui/update.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>UpdateDialog</class>\n <widget class=\"QDialog\" name=\"UpdateDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>168</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Dialog</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QStackedWidget\" name=\"stackedWidget\">\n     <property name=\"currentIndex\">\n      <number>2</number>\n     </property>\n     <widget class=\"QWidget\" name=\"spinnerPage\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\" stretch=\"1,0\">\n       <item>\n        <widget class=\"QQuickWidget\" name=\"spinnerQuickWidget\">\n         <property name=\"resizeMode\">\n          <enum>QQuickWidget::SizeRootObjectToView</enum>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"label\">\n         <property name=\"text\">\n          <string>Checking for update...</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"errorPage\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\" stretch=\"0,1,0\">\n       <item>\n        <widget class=\"QLabel\" name=\"errorTitleLabel\">\n         <property name=\"font\">\n          <font>\n           <pointsize>12</pointsize>\n          </font>\n         </property>\n         <property name=\"text\">\n          <string notr=\"true\">title placeholder</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"errorMessageLabel\">\n         <property name=\"text\">\n          <string notr=\"true\">message placeholder</string>\n         </property>\n         <property name=\"alignment\">\n          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QDialogButtonBox\" name=\"errorButtonBox\">\n         <property name=\"standardButtons\">\n          <set>QDialogButtonBox::Close</set>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"updaterPage\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n       <property name=\"leftMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>QQuickWidget</class>\n   <extends>QWidget</extends>\n   <header location=\"global\">QtQuickWidgets/QQuickWidget</header>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/update_main.cpp",
    "content": "// system includes\n#include <iostream>\n#include <sstream>\n\n// library includes\n#include <QApplication>\n#include <QCheckBox>\n#include <QCommandLineParser>\n#include <QFile>\n#include <QLibraryInfo>\n#include <QMessageBox>\n#include <QPushButton>\n#include <QTranslator>\n#include <QThread>\nextern \"C\" {\n    #include <appimage/appimage.h>\n}\n#include <appimage/update/qt-ui.h>\n\n// local includes\n#include \"shared.h\"\n#include \"translationmanager.h\"\n#include \"ui_update.h\"\n\nusing namespace appimage::update::qt;\n\nclass UpdateDialog : public QDialog {\n    Q_OBJECT\n\npublic:\n    explicit UpdateDialog(const QString& pathToAppImage) : _pathToAppImage(pathToAppImage), _ui(new Ui::UpdateDialog), _updater(new QtUpdater(pathToAppImage)) {\n        // configure UI\n        _ui->setupUi(this);\n\n        _ui->stackedWidget->setCurrentIndex(0);\n\n        // these three calls are needed to give the QQuickWidget the same background color as its parent window\n        _ui->spinnerQuickWidget->setAttribute(Qt::WA_AlwaysStackOnTop);\n        _ui->spinnerQuickWidget->setAttribute(Qt::WA_TranslucentBackground);\n        _ui->spinnerQuickWidget->setClearColor(Qt::transparent);\n\n        _ui->spinnerQuickWidget->setSource(QUrl::fromLocalFile(\":/update_spinner.qml\"));\n\n        // can't add the widget to the page directly in the .ui file since the constructor needs parameters\n        _ui->updaterPage->layout()->addWidget(_updater);\n\n        // make sure the QDialog resizes with the spoiler\n        layout()->setSizeConstraint(QLayout::SetFixedSize);\n\n        // make sure that when the embedded dialog closes, the parent dialog closes, too\n        connect(_updater, &QDialog::finished, this, &QDialog::done);\n\n        // set up updater\n        _updater->enableRunUpdatedAppImageButton(false);\n\n        connect(\n            _updater,\n            &QtUpdater::newStatusMessage,\n            this,\n            [this](const std::string& newMessage) {\n                if (_updaterStatusMessages.tellp() > 0)\n                    _updaterStatusMessages << std::endl;\n\n                _updaterStatusMessages << newMessage;\n            }\n        );\n\n        connect(this, &UpdateDialog::updateCheckFinished, this, [this](int updateCheckResult) {\n            switch (updateCheckResult) {\n                case 1:\n                    clearStatusMessages();\n                    _ui->stackedWidget->setCurrentWidget(_ui->updaterPage);\n                    _updater->update();\n                    return;\n                case 0: {\n                    _ui->errorTitleLabel->setText(tr(\"No updates found\"));\n                    _ui->errorMessageLabel->setText(tr(\"Could not find updates for AppImage %1\").arg(_pathToAppImage));\n                    connect(_ui->errorButtonBox, &QDialogButtonBox::clicked, this, &QDialog::accept);\n                    break;\n                }\n                case -1: {\n                    _ui->errorTitleLabel->setText(tr(\"No update information found\"));\n                    _ui->errorMessageLabel->setText(\n                        tr(\"Could not find update information in AppImage:\\n%1\"\n                           \"\\n\"\n                           \"\\n\"\n                           \"The AppImage doesn't support updating. Please ask the authors to embed \"\n                           \"update information to allow for easy updating.\"\n                        ).arg(_pathToAppImage)\n                    );\n                    connect(_ui->errorButtonBox, &QDialogButtonBox::clicked, this, &QDialog::reject);\n                    break;\n                }\n                default: {\n                    _ui->errorTitleLabel->setText(tr(\"Update check failed\"));\n                    _ui->errorMessageLabel->setText(tr(\"Failed to check for updates:\\n%1\").arg(_pathToAppImage));\n                    connect(_ui->errorButtonBox, &QDialogButtonBox::clicked, this, &QDialog::reject);\n                    break;\n                }\n            }\n\n            _ui->stackedWidget->setCurrentWidget(_ui->errorPage);\n            qCritical() << statusMessages();\n        });\n\n        asyncCheckForUpdate();\n    }\n\n    ~UpdateDialog() override {\n        // TODO: parenting in libappimageupdate\n        delete _updater;\n    }\n\n    QString statusMessages() const {\n        return QString::fromStdString(_updaterStatusMessages.str());\n    }\n\n    void clearStatusMessages() {\n        _updaterStatusMessages.clear();\n    }\n\n    void asyncCheckForUpdate() {\n        // TODO: implement an async update check in libappimageupdate\n        auto* thread = QThread::create([this]() {\n            auto updateCheckResult = _updater->checkForUpdates();\n            emit updateCheckFinished(updateCheckResult);\n        });\n        thread->start();\n    }\n\nsignals:\n    void updateCheckFinished(int checkResult);\n\nprivate:\n    const QString _pathToAppImage;\n    Ui::UpdateDialog* _ui;\n    QtUpdater *_updater;\n    std::ostringstream _updaterStatusMessages;\n};\n\n#include \"update_main.moc\"\n\n\nint main(int argc, char** argv) {\n    QCommandLineParser parser;\n    parser.setApplicationDescription(QObject::tr(\"Updates AppImages after desktop integration, for use by Linux distributions\"));\n\n    QApplication app(argc, argv);\n    QApplication::setApplicationDisplayName(QObject::tr(\"AppImageLauncher update\", \"update helper app name\"));\n    QApplication::setWindowIcon(QIcon(\":/AppImageLauncher.svg\"));\n\n    std::ostringstream version;\n    version << \"version \" << APPIMAGELAUNCHER_VERSION << \" \"\n            << \"(git commit \" << APPIMAGELAUNCHER_GIT_COMMIT << \"), built on \"\n            << APPIMAGELAUNCHER_BUILD_DATE;\n    QApplication::setApplicationVersion(QString::fromStdString(version.str()));\n\n    // install translations\n    TranslationManager translationManager(app);\n\n    parser.addHelpOption();\n    parser.addVersionOption();\n\n    parser.process(app);\n\n    parser.addPositionalArgument(\"path\", \"Path to AppImage\", \"<path>\");\n\n    if (parser.positionalArguments().empty()) {\n        parser.showHelp(1);\n    }\n\n    const auto pathToAppImage = parser.positionalArguments().first();\n\n    auto criticalUpdaterError = [](const QString& message) {\n        QMessageBox::critical(nullptr, \"Error\", message);\n    };\n\n    if (!QFile(pathToAppImage).exists()) {\n        criticalUpdaterError(QString::fromStdString(QObject::tr(\"Error: no such file or directory: %1\").arg(pathToAppImage).toStdString()));\n        return 1;\n    }\n\n    const auto type = appimage_get_type(pathToAppImage.toStdString().c_str(), false);\n\n    if (type <= 0 || type > 2) {\n        criticalUpdaterError(QObject::tr(\"Not an AppImage: %1\").arg(pathToAppImage));\n        return 1;\n    }\n\n    auto dialog = new UpdateDialog(pathToAppImage);\n    dialog->show();\n\n    return QApplication::exec();\n}\n"
  },
  {
    "path": "src/ui/update_spinner.qml",
    "content": "import QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.15\n\nColumnLayout {\n    BusyIndicator {\n        running: true\n        width: 64\n        height: 64\n        Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter\n    }\n}\n"
  }
]